diff --git a/.gitignore b/.gitignore
index fce9dbb845b358e601b76dc08e17996aa376fc40..9ad54f92a6c4a7d608f1b67cd37d367e29aab38a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,4 +6,5 @@ nbproject/
 /.project
 /.idea
 ~dev_rating/.idea/
-/~dev_rating/modules/unittest/vendor/
\ No newline at end of file
+/~dev_rating/modules/unittest/vendor/
+db/disciplines activity.sql
diff --git a/db/StoredFunctions.sql b/db/StoredFunctions.sql
index 251aed9cd7db4d1224e70800c51366ceb447b0b9..d3c31d452d2f98b9198889bf15cf2587c9db3f2c 100644
--- a/db/StoredFunctions.sql
+++ b/db/StoredFunctions.sql
@@ -18,6 +18,32 @@ DROP FUNCTION IF EXISTS OrderModuleTypesForSession//
 
 DROP FUNCTION IF EXISTS CreateStudyGroup//
 
+DROP FUNCTION IF EXISTS GetAccCountByCode//
+DROP FUNCTION IF EXISTS GetAccCountByMail//
+DROP FUNCTION IF EXISTS GetAccCountByLogin//
+
+DROP FUNCTION IF EXISTS ChangePassword//
+DROP FUNCTION IF EXISTS ChangeLogin//
+DROP FUNCTION IF EXISTS ChangeMail//
+
+DROP FUNCTION IF EXISTS GetRateForDisc//
+
+drop function if exists InternalIsTeacherBounded//
+DROP FUNCTION IF EXISTS SetSemesterID//
+DROP FUNCTION IF EXISTS AddDiscipline//
+
+DROP FUNCTION IF EXISTS GetMaxRateForDisc//
+
+DROP FUNCTION IF EXISTS BindTeacher//
+
+DROP FUNCTION IF EXISTS GetDisciplineSemesterID//
+
+DROP FUNCTION IF EXISTS SetBitmaskByPagename//
+DROP FUNCTION IF EXISTS GetBitmaskByPagename//
+DROP FUNCTION IF EXISTS SetSettings//
+
+
+
 
 # -------------------------------------------------------------------------------------------
 # Label: abbreviations
@@ -34,122 +60,122 @@ DROP FUNCTION IF EXISTS CreateStudyGroup//
 # actually check for first scoring, in this case you cannot yet edit discipline
 # "SetRate" stored procedure can change isLocked flag
 DROP FUNCTION IF EXISTS InternalIsMapLocked//
-CREATE FUNCTION `InternalIsMapLocked`
-    (`pDisciplineID` INT) RETURNS BOOLEAN
+CREATE FUNCTION `InternalIsMapLocked` (
+        `pDisciplineID` INT
+    ) RETURNS BOOLEAN
     NO SQL
 BEGIN
-    RETURN EXISTS(
-        SELECT * FROM `disciplines`
-        WHERE disciplines.ID = pDisciplineID AND disciplines.isLocked = 1
-    );
+    DECLARE vChecker BOOLEAN DEFAULT FALSE;
+
+    SELECT disciplines.IsLocked INTO vChecker
+        FROM `disciplines`
+        WHERE disciplines.ID = pDisciplineID
+        LIMIT 1;
+
+    RETURN vChecker;
 END //
 
 
 # check, that student really take this course
 DROP FUNCTION IF EXISTS InternalIsStudentAttached//
-CREATE FUNCTION `InternalIsStudentAttached`
-    (`pStudentID` INT, `pDisciplineID` INT) RETURNS BOOLEAN
+CREATE FUNCTION `InternalIsStudentAttached` (
+        `pStudentID` INT,
+        `pDisciplineID` INT,
+        `pSemesterID` INT
+    ) RETURNS BOOLEAN
     NO SQL
 BEGIN
-    RETURN EXISTS(
-        SELECT * FROM `view_disciplines_students`
-        WHERE view_disciplines_students.SemesterID = @CurrentSemesterID AND
+    DECLARE vAttachType enum('attach','detach') DEFAULT NULL;
+
+    SELECT view_disciplines_students.AttachType INTO vAttachType
+        FROM `view_disciplines_students`
+        WHERE view_disciplines_students.SemesterID = pSemesterID AND
               view_disciplines_students.StudentID = pStudentID AND
-              view_disciplines_students.DisciplineID = pDisciplineID AND
-              (view_disciplines_students.AttachType IS NULL OR
-                  view_disciplines_students.AttachType = 'attach')
-        );
+              view_disciplines_students.DisciplineID = pDisciplineID
+        LIMIT 1;
+
+    RETURN ( NOT vAttachType  <=> 'detach' );
 END //
 
 
+
 # check, that teacher teach this course
-drop function if exists InternalIsTeacherBounded//
-CREATE FUNCTION `InternalIsTeacherBounded`
-    (   `pTeacherID` INT, `pDisciplineID` INT) RETURNS BOOLEAN
+DROP FUNCTION IF EXISTS InternalIsTeacherBound//
+CREATE FUNCTION InternalIsTeacherBound (
+        `pTeacherID` INT,
+        `pDisciplineID` INT
+    ) RETURNS BOOLEAN
     NO SQL
 BEGIN
-    RETURN EXISTS (SELECT * FROM `disciplines_teachers`
-                   WHERE disciplines_teachers.TeacherID = pTeacherID AND
-                         disciplines_teachers.DisciplineID = pDisciplineID);
+    RETURN EXISTS (
+        SELECT * FROM `disciplines_teachers`
+            WHERE   disciplines_teachers.TeacherID = pTeacherID AND
+                    disciplines_teachers.DisciplineID = pDisciplineID
+            LIMIT 1
+    );
 END //
 
 
 DROP FUNCTION IF EXISTS InternalIsTeacherAuthor//
-CREATE FUNCTION `InternalIsTeacherAuthor`
-    (   `pTeacherID` INT, `pDisciplineID` INT) RETURNS BOOLEAN
+CREATE FUNCTION `InternalIsTeacherAuthor` (
+        `pTeacherID` INT,
+        `pDisciplineID` INT
+    ) RETURNS BOOLEAN
     NO SQL
 BEGIN
-    RETURN EXISTS (SELECT * FROM `disciplines`
-                        WHERE disciplines.ID = pDisciplineID AND disciplines.AuthorID = pTeacherID);
-END //
+    DECLARE vAuthorID INT DEFAULT -1;
 
-
-DROP FUNCTION IF EXISTS GetRateForDisc//
-CREATE FUNCTION `GetRateForDisc`
-    (   `pStudentID` INT, `pDisciplineID` INT) RETURNS int(11)
-    NO SQL
-BEGIN
-    DECLARE vRate INT DEFAULT -1;
-
-    SELECT SUM(rating_table.Rate)
-        INTO vRate
-        FROM `rating_table`
-        INNER JOIN `submodules` ON  rating_table.SubmoduleID = submodules.ID
-        INNER JOIN `modules`    ON  submodules.ModuleID = modules.ID AND
-                                    modules.DisciplineID = pDisciplineID
-        WHERE   rating_table.StudentID = pStudentID AND
-            (   modules.Type != 'exam' OR
-                submodules.ID =
-                    (   SELECT submodules.ID
-                        FROM `submodules`
-                        INNER JOIN `rating_table` ON rating_table.SubModuleID = submodules.ID
-                        WHERE   submodules.ModuleID = modules.ID AND
-                                rating_table.StudentID = pStudentID
-                        ORDER BY submodules.OrderNum DESC
-                        LIMIT 1
-                    )
-            )
+    SELECT disciplines.AuthorID INTO vAuthorID
+        FROM `disciplines`
+        WHERE disciplines.ID = pDisciplineID
         LIMIT 1;
 
-    RETURN  vRate;
+    RETURN ( vAuthorID = pTeacherID );
 END //
 
 
-DROP FUNCTION IF EXISTS SetSessionOption//
-CREATE FUNCTION `SetSessionOption`
-    (   `pStudentID` INT, `pSubmoduleID` INT,
-        `pType` VARCHAR(30) CHARSET utf8 # enum('absence','pass')
+
+DROP FUNCTION IF EXISTS SetExamPeriodOption//
+CREATE FUNCTION `SetExamPeriodOption` (
+        `pStudentID` INT,
+        `pSubmoduleID` INT,
+        `pType` enum('absence','pass')
     ) RETURNS int(11)
     NO SQL
 BEGIN
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
-    INSERT INTO `session_options`
+    INSERT INTO `exam_period_options`
         (StudentID, SubmoduleID, Type) VALUES(pStudentID, pSubmoduleID, pType)
         ON DUPLICATE KEY UPDATE
-        session_options.Type = pType;
+            exam_period_options.Type = pType;
 
     RETURN  0;
 END //
 
 
-# check, if any module is created
+# check, regular + exam rate == 100
 DROP FUNCTION IF EXISTS InternalIsMapCreated//
-CREATE FUNCTION `InternalIsMapCreated`
-    (   `pDisciplineID` INT) RETURNS int(11)
+CREATE FUNCTION `InternalIsMapCreated` (
+        `pDisciplineID` INT
+    ) RETURNS int(11)
     NO SQL
 BEGIN
-    RETURN EXISTS (
-        SELECT * FROM `view_disciplines_results`
-        WHERE view_disciplines_results.DisciplineID = pDisciplineID AND
-              view_disciplines_results.DisciplineRateMax = 100
-    );
+    DECLARE vMaxRate INT DEFAULT -1;
+
+    SELECT view_disciplines_results.DisciplineRateMax INTO vMaxRate
+        FROM `view_disciplines_results`
+        WHERE view_disciplines_results.DisciplineID = pDisciplineID
+        LIMIT 1;
+
+    RETURN ( vMaxRate = 100 );
 END //
 
 # ordering helper
 DROP FUNCTION IF EXISTS InternalOrderModuleTypesForSession//
-CREATE FUNCTION `InternalOrderModuleTypesForSession`
-    (`pModuleType` INT ) RETURNS INT(3)
+CREATE FUNCTION `InternalOrderModuleTypesForSession` (
+        `pModuleType` INT
+    ) RETURNS INT(3)
     NO SQL
 BEGIN
     DECLARE vRes INT DEFAULT 0;
@@ -158,7 +184,7 @@ BEGIN
         WHEN 4 THEN SET vRes = 1; # extra
         WHEN 2 THEN SET vRes = 2; # exam
         WHEN 3 THEN SET vRes = 3; # bonus
-    ELSE SET vRes = 4;
+        ELSE SET vRes = 4;
     END CASE;
 
     RETURN vRes;
@@ -174,60 +200,36 @@ END //
 
 # set values of record with key \pKey,
 # if doesn't exist, then create.
-DROP FUNCTION IF EXISTS SetSettings//
-CREATE FUNCTION `SetSettings`
-    (`pKey` VARCHAR(50) CHARSET utf8, `pVal` INT, `pValS` VARCHAR(300) CHARSET utf8
-    ) RETURNS int(11)
-    NO SQL
-BEGIN
-    INSERT INTO `general_settings`
-        (Val, ValS, Name) VALUES(pVal, pValS, pKey)
-        ON DUPLICATE KEY UPDATE
-            general_settings.Val = pVal,
-            general_settings.ValS = pValS;
-        RETURN 0;
-END//
-
-
-
-DROP FUNCTION IF EXISTS SetBitmaskByPagename//
-CREATE FUNCTION `SetBitmaskByPagename`
-    (`pPagename` TEXT CHARSET utf8, `pMask` INT) RETURNS int(11)
-    NO SQL
-BEGIN
-    INSERT INTO `page_access`
-        (Pagename, Bitmask) VALUES(pPagename, pMask)
-        ON DUPLICATE KEY UPDATE
-            page_access.Bitmask = pMask;
-    RETURN 0;
-END //
 
 
 
-DROP FUNCTION IF EXISTS GetBitmaskByPagename//
-CREATE FUNCTION `GetBitmaskByPagename` (`pPagename` TEXT CHARSET utf8) RETURNS int(11)
-    NO SQL
-BEGIN
-    RETURN (SELECT page_access.Bitmask
-                FROM `page_access`
-                WHERE page_access.Pagename = pPagename
-                LIMIT 1);
-END //
-
-
 
 
 # -------------------------------------------------------------------------------------------
 # Label: semesters
 # -------------------------------------------------------------------------------------------
 
-# set current(for user) semester, life time - db session
-DROP FUNCTION IF EXISTS SetSemesterID//
-CREATE FUNCTION `SetSemesterID` (`pSemesterID` INT) RETURNS int(11)
+DROP FUNCTION IF EXISTS GetDisciplineProperty//
+CREATE FUNCTION `GetDisciplineProperty` (
+    `pDisciplineID` INT,
+    `pType` enum('grade', 'subject', 'author', 'semester', 'milestone')
+) RETURNS int(11)
     NO SQL
 BEGIN
-    SET @CurrentSemesterID := pSemesterID;
-    RETURN 0;
+    DECLARE vRes INT DEFAULT -1;
+
+    SELECT CASE pType
+            WHEN 'grade' THEN disciplines.GradeID
+            WHEN 'subject' THEN disciplines.SubjectID
+            WHEN 'author' THEN disciplines.AuthorID
+            WHEN 'semester' THEN disciplines.SemesterID
+            WHEN 'milestone' THEN disciplines.Milestone
+        END INTO vRes
+        FROM `disciplines`
+        WHERE disciplines.ID = pDisciplineID
+        LIMIT 1;
+
+    RETURN vRes;
 END //
 
 
@@ -237,58 +239,82 @@ END //
 # -------------------------------------------------------------------------------------------
 
 DROP FUNCTION IF EXISTS CreateFaculty //
-CREATE FUNCTION CreateFaculty
-    (   `pFacultyName` VARCHAR(100) CHARSET utf8,
-        `pFacultyAbbr` VARCHAR(20) CHARSET utf8
-    ) RETURNS INT(11)
+CREATE FUNCTION CreateFaculty (
+        `pFacultyName` TEXT CHARSET utf8,
+        `pFacultyAbbr` TEXT CHARSET utf8
+    ) RETURNS INT(11) # -1 or id
     NO SQL
 BEGIN
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
     INSERT INTO faculties
-    (Name, Abbr)
-    VALUES(pFacultyName, pFacultyAbbr);
-    RETURN 0;
-END //
+        (Name, Abbr) VALUES(pFacultyName, pFacultyAbbr);
+    RETURN LAST_INSERT_ID();
+END//
 
 # -------------------------------------------------------------------------------------------
 # Label: departments
 # -------------------------------------------------------------------------------------------
 
+# create department or return existing
 DROP FUNCTION IF EXISTS CreateDepartment //
-CREATE FUNCTION CreateDepartment
-    (   `pName` VARCHAR(200) CHARSET utf8,
+CREATE FUNCTION CreateDepartment (
+        `pName` VARCHAR(200) CHARSET utf8,
         `pFacultyID` INT(11)
-    ) RETURNS INT(11)
-NO SQL
-    BEGIN
-        DECLARE vChecker INT DEFAULT -1;
-        DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
+    ) RETURNS INT(11) # department id or -1 if failed
+    NO SQL
+BEGIN
+    DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
-        SELECT faculties.ID INTO vChecker
-        FROM `faculties`
-        WHERE faculties.ID = pFacultyID
-        LIMIT 1;
+    INSERT INTO departments
+        (Name, FacultyID) VALUES (pName, pFacultyID)
+        ON DUPLICATE KEY UPDATE
+            departments.ID = LAST_INSERT_ID(departments.ID);
 
-        IF vChecker > 0 THEN
-            INSERT INTO departments
-            (Name, FacultyID)
-            VALUES(pName, pFacultyID);
-            RETURN 0;
-        END IF;
-        RETURN -1;
-    END //
+    RETURN LAST_INSERT_ID();
+END //
 
 # -------------------------------------------------------------------------------------------
-# Label: study groups
+# Label: specializations
 # -------------------------------------------------------------------------------------------
 
+
+
+# -------------------------------------------------------------------------------------------
+# Label: grades
+# -------------------------------------------------------------------------------------------
+
+DROP FUNCTION IF EXISTS CreateGrade//
+CREATE FUNCTION `CreateGrade` (
+    `pGradeNum` INT,
+    `pDegree` enum('bachelor', 'master', 'specialist')
+) RETURNS int(11) # groupID or -1 if failed
+    NO SQL
+BEGIN
+    DECLARE vGradeID INT DEFAULT -1;
+    DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
+
+    INSERT INTO `grades`
+        (Num, Degree) VALUES (pGradeNum, pDegree)
+        ON DUPLICATE KEY UPDATE
+            grades.ID = LAST_INSERT_ID(grades.ID);
+
+    RETURN LAST_INSERT_ID();
+END //
+
+# -------------------------------------------------------------------------------------------
+# Label: groups
+# -------------------------------------------------------------------------------------------
+
+
 # negative int, if already exists
 DROP FUNCTION IF EXISTS CreateGroup//
-CREATE FUNCTION `CreateGroup`
-    (   `pGradeID` INT, `pGroupNum` INT,
-        `pSpecializationID` INT, `pGroupName` VARCHAR(50) CHARSET utf8
-    )   RETURNS int(11)
+CREATE FUNCTION `CreateGroup` (
+    `pGradeID` INT,
+    `pGroupNum` INT,
+    `pSpecializationID` INT,
+    `pGroupName` VARCHAR(50) CHARSET utf8
+) RETURNS int(11) # group id
     NO SQL
 BEGIN
     # check GradeID, SpecID constraints and (GradeID, GroupNum, SpecID) - unique
@@ -297,69 +323,116 @@ BEGIN
     # create discipline
     INSERT INTO `study_groups`
         (GradeID, GroupNum, SpecializationID, Name)
-        VALUES (pGradeID, pGroupNum, pSpecializationID, pGroupName);
-    RETURN 0;
+        VALUES (pGradeID, pGroupNum, pSpecializationID, pGroupName)
+        ON DUPLICATE KEY UPDATE
+            study_groups.ID = LAST_INSERT_ID(study_groups.ID);
+    RETURN LAST_INSERT_ID();
+END //
+
+
+DROP FUNCTION IF EXISTS GetGroup//
+CREATE FUNCTION `GetGroup` (
+        `pGradeID` INT,
+        `pGroupNum` INT,
+        `pFacultyID` INT
+    ) RETURNS int(11) # groupID or -1 if failed
+    NO SQL
+BEGIN
+    DECLARE vGroupID INT DEFAULT -1;
+
+    SELECT study_groups.ID INTO vGroupID
+        FROM `study_groups`
+        INNER JOIN `specializations` ON specializations.ID = study_groups.SpecializationID
+        WHERE   study_groups.GradeID = pGradeID AND
+                study_groups.GroupNum = pGroupNum AND
+                specializations.FacultyID = pFacultyID
+        LIMIT 1;
+
+    RETURN vGroupID;
+END //
+
+
+DROP FUNCTION IF EXISTS GetStudentGroup//
+CREATE FUNCTION `GetStudentGroup` (
+    `pStudentID` INT,
+    `pSemesterID` INT
+) RETURNS int(11) # groupID or -1 if failed
+    NO SQL
+BEGIN
+    DECLARE vGroupID INT DEFAULT -1;
+
+    SELECT students_groups.GroupID INTO vGroupID
+        FROM `students_groups`
+        WHERE   students_groups.StudentID = pStudentID AND
+                students_groups.SemesterID = pSemesterID
+        LIMIT 1;
+
+    RETURN vGroupID;
 END //
 
 
+
+
 # -------------------------------------------------------------------------------------------
 # Label: subjects
 # -------------------------------------------------------------------------------------------
 
 DROP FUNCTION IF EXISTS CreateSubject//
-CREATE FUNCTION `CreateSubject`
-    (   `pFacultyID` INT,
-        `pSubjectName` VARCHAR(200) CHARSET utf8,
+CREATE FUNCTION `CreateSubject` (
+        `pFacultyID` INT,
+        `pSubjectName` TEXT CHARSET utf8,
         `pSubjectAbbr` VARCHAR(20) CHARSET utf8
     )   RETURNS int(11)
     NO SQL
 BEGIN
     DECLARE vSubjectID INT DEFAULT -1;
 
-    # find same subject
-    SELECT subjects.ID INTO vSubjectID
-        FROM `subjects`
-        WHERE subjects.Name = pSubjectName
-        LIMIT 1;
-    IF vSubjectID <= 0 THEN
-        # create new subject
-        INSERT INTO `subjects`
-            (Name, Abbr) VALUES(pSubjectName, pSubjectAbbr);
-        SET vSubjectID = LAST_INSERT_ID();
-    END IF;
+    # create/get subject (subject name is unique key)
+    INSERT INTO `subjects`
+        (Name, Abbr) VALUES (pSubjectName, pSubjectAbbr)
+        ON DUPLICATE KEY UPDATE
+            subjects.ID = LAST_INSERT_ID(subjects.ID);
+    SET vSubjectID = LAST_INSERT_ID();
 
     BEGIN # handler block
         DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
+
         # try to attach subject to faculty
         INSERT INTO `subjects_faculties`
-            (SubjectID, FacultyID)
-            VALUES (vSubjectID, pFacultyID)
+            (SubjectID, FacultyID) VALUES (vSubjectID, pFacultyID)
             ON DUPLICATE KEY UPDATE # just stub
-                subjects_faculties.FacultyID = subjects_faculties.FacultyID;
+                subjects_faculties.ID = LAST_INSERT_ID(subjects_faculties.ID);
     END;
+
+    # todo: should return 1, if subject already exists.
+    # the behaviour is expected at FileParser::updateSubjects()
+    # or you can write a new function Subject_exists(name)
+
     RETURN 0;
 END //
 
 
 DROP FUNCTION IF EXISTS DeleteSubject //
-CREATE FUNCTION DeleteSubject
-    (`pSubjectID` INT) RETURNS TEXT
+CREATE FUNCTION DeleteSubject (
+        `pSubjectID` INT
+    ) RETURNS INT(11) # 0 - success
     NO SQL
 BEGIN
-    DECLARE vChecker INT DEFAULT -1;
+    DECLARE vChecker BOOLEAN DEFAULT FALSE;
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
-    SELECT disciplines.ID INTO vChecker
-        FROM `disciplines`
+    SET vChecker = EXISTS(
+        SELECT * FROM `disciplines`
         WHERE disciplines.SubjectID = pSubjectID
-        LIMIT 1;
-    IF vChecker > 0 THEN
+        LIMIT 1
+    );
+    IF vChecker THEN
         RETURN -1; # Удаляемый предмет используется в disciplines.
     END IF;
 
     DELETE FROM `subjects_faculties`
         WHERE subjects_faculties.SubjectID = pSubjectID;
-        DELETE FROM `subjects`
+    DELETE FROM `subjects`
         WHERE subjects.ID = pSubjectID
         LIMIT 1;
 
@@ -371,45 +444,60 @@ END //
 # Label: accounts
 # -------------------------------------------------------------------------------------------
 
-# TODO: rename
-DROP FUNCTION IF EXISTS GetAccCountByCode//
-CREATE FUNCTION `GetAccCountByCode` (`pCode` VARCHAR(40) CHARSET utf8) RETURNS int(11)
-    NO SQL
-BEGIN
-    RETURN EXISTS(SELECT * FROM `accounts` WHERE accounts.ActivationCode = pCode);
-END //
 
 
-DROP FUNCTION IF EXISTS GetAccCountByMail //
-CREATE FUNCTION `GetAccCountByMail` (`pEMail` VARCHAR(50) CHARSET utf8) RETURNS int(11)
-    NO SQL
-BEGIN
-    RETURN EXISTS(SELECT * FROM `accounts` WHERE accounts.EMail = pEMail);
-END //
 
-
-DROP FUNCTION IF EXISTS GetAccCountByLogin//
-CREATE FUNCTION `GetAccCountByLogin` (`pLogin` VARCHAR(50) CHARSET utf8) RETURNS int(11)
+DROP FUNCTION IF EXISTS CheckAccountExistence//
+CREATE FUNCTION `CheckAccountExistence` (
+        `pData` TEXT CHARSET utf8,
+        `pType` enum('login','email', 'code')
+    ) RETURNS BOOLEAN # TRUE - exist, FALSE - doesn't
     NO SQL
 BEGIN
-    RETURN EXISTS(SELECT * FROM `accounts` WHERE accounts.Login = pLogin);
-END //
+    DECLARE vRes BOOLEAN DEFAULT FALSE;
 
+    SET vRes = EXISTS(
+        SELECT * FROM `accounts`
+            WHERE CASE pType
+                WHEN 'login' THEN pData = accounts.Login
+                WHEN 'email' THEN pData = accounts.EMail
+                WHEN 'code' THEN pData = accounts.ActivationCode
+                ELSE FALSE
+            END
+        LIMIT 1
+    );
 
+    RETURN vRes;
+END //
 
 
+# return:
+#   -1 - unknown error.
+#   -2 - code doesn't exists.
+#   -3 - email already registered.
+#   -4 - login already registered.
 DROP FUNCTION IF EXISTS ActivateAccount//
-CREATE FUNCTION `ActivateAccount`
-    (   `pCode` VARCHAR(40) CHARSET utf8,
+CREATE FUNCTION `ActivateAccount` (
+        `pCode` VARCHAR(40) CHARSET utf8,
         `pLogin` VARCHAR(50) CHARSET utf8,
         `pEMail` VARCHAR(50) CHARSET utf8,
         `pPassword` VARCHAR(255) CHARSET utf8
-    )   RETURNS int(11)
+    ) RETURNS int(11)
     NO SQL
 BEGIN
+    DECLARE vExistEmail, vExistLogin BOOLEAN DEFAULT FALSE;
     # check for matching with existing accounts (note: Login & E-Mail are unique)
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
+    SET vExistEmail = CheckAccountExistence(pEMail, 'email');
+    IF vExistEmail THEN
+        RETURN -3;
+    END IF;
+    SET vExistLogin = CheckAccountExistence(pLogin, 'login');
+    IF vExistLogin THEN
+        RETURN -4;
+    END IF;
+
     # activate account
     UPDATE `accounts`
         SET accounts.Login = pLogin,
@@ -417,85 +505,61 @@ BEGIN
             accounts.EMail = pEMail,
             accounts.ActivationCode = NULL
         WHERE accounts.ActivationCode = pCode AND
-              (@vAccountID := accounts.ID) > 0 # save accountID
+              ( @vAccountID := accounts.ID ) # save accountID
         LIMIT 1;
 
-    IF (ROW_COUNT() = 0) THEN
+    IF ( ROW_COUNT() = 0 ) THEN
         RETURN -2; # account with this Code not found
+    ELSE
+        RETURN @vAccountID;
     END IF;
-    RETURN @vAccountID;
-END //
-
-
-
-DROP FUNCTION IF EXISTS ChangePassword//
-CREATE FUNCTION `ChangePassword`
-    (   `pUserID` INT, `pPassword` VARCHAR(255) CHARSET utf8
-    )   RETURNS int(11)
-    NO SQL
-BEGIN
-    DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
-
-    # set new password
-    UPDATE `accounts`
-        SET accounts.Password = pPassword
-        WHERE accounts.ID = pUserID
-        LIMIT 1;
-    RETURN ROW_COUNT()-1; # -1 if account doesn't exists, otherwise 0
 END //
 
 
-
-DROP FUNCTION IF EXISTS ChangeLogin//
-CREATE FUNCTION `ChangeLogin`
-    (   `pUserID` INT, `pLogin` VARCHAR(50) CHARSET utf8
-    )   RETURNS int(11)
+DROP FUNCTION IF EXISTS ChangeAccountData//
+CREATE FUNCTION `ChangeAccountData` (
+        `pUserID` INT,
+        `pData` TEXT CHARSET utf8,
+        `pType` enum('login', 'email', 'password')
+    ) RETURNS int(11) # 0 - success, <0 - failed
     NO SQL
 BEGIN
-    # check set login: login - unique
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
-    # set new login
-    UPDATE `accounts`
-        SET accounts.Login = pLogin
-        WHERE accounts.ID = pUserID
-        LIMIT 1;
-    RETURN ROW_COUNT()-1; # -1 if account doesn't exists, otherwise 0
-END //
-
-
-
-DROP FUNCTION IF EXISTS ChangeMail//
-CREATE FUNCTION `ChangeMail`
-    (`pUserID` INT, `pEMail` VARCHAR(50) CHARSET utf8
-    )   RETURNS int(11)
-    NO SQL
-BEGIN
-    # check set login: login - unique
-    DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
+    CASE pType
+        WHEN 'login' THEN
+            UPDATE `accounts`
+                SET accounts.Login = pData
+                WHERE accounts.ID = pUserID
+                LIMIT 1;
+        WHEN 'email' THEN
+            UPDATE `accounts`
+                SET accounts.EMail = pData
+                WHERE accounts.ID = pUserID
+                LIMIT 1;
+        WHEN 'password' THEN
+            UPDATE `accounts`
+                SET accounts.Password = pData
+                WHERE accounts.ID = pUserID
+                LIMIT 1;
+    END CASE;
 
-    # set new e-mail
-    UPDATE `accounts`
-        SET accounts.EMail = pEMail
-        WHERE accounts.ID = pUserID
-        LIMIT 1;
-    RETURN ROW_COUNT()-1; # -1 if account doesn't exists, otherwise 0
+    RETURN ROW_COUNT()-1;
 END //
 
 
 
 DROP FUNCTION IF EXISTS SignIn//
-CREATE FUNCTION `SignIn`
-    (   `pLoginOrMail` VARCHAR(255) CHARSET utf8,
+CREATE FUNCTION `SignIn` (
+        `pLoginOrMail` VARCHAR(255) CHARSET utf8,
         `pPassword`  VARCHAR(64) CHARSET utf8
-    )   RETURNS int(11)
+    ) RETURNS int(11) # account id
     NO SQL
 BEGIN
     DECLARE vAccountID INT DEFAULT -1;
 
     #check account existence
-    SELECT accounts.ID
-        INTO vAccountID
+    SELECT accounts.ID INTO vAccountID
         FROM `accounts`
         WHERE   accounts.Password = pPassword AND
                 (accounts.Login = pLoginOrMail OR accounts.EMail = pLoginOrMail)
@@ -504,8 +568,8 @@ BEGIN
         RETURN -1;
     END IF;
 
-    # logging
-    INSERT INTO `logs_signin`
+    # TODO: extract method - log sign in
+    INSERT INTO `logs_signin` # logging
         (AccountID) VALUES (vAccountID);
     RETURN vAccountID;
 END //
@@ -518,14 +582,14 @@ END //
 # -------------------------------------------------------------------------------------------
 
 DROP FUNCTION IF EXISTS ChangeTeacherInfo//
-CREATE FUNCTION `ChangeTeacherInfo`
-    (   `pTeacherID` INT,
+CREATE FUNCTION `ChangeTeacherInfo` (
+        `pTeacherID` INT,
         `pLastName` VARCHAR(30) CHARSET utf8,
         `pFirstName` VARCHAR(30) CHARSET utf8,
         `pSecondName` VARCHAR(30) CHARSET utf8,
         `pJobPositionID` INT,
         `pDepartmentID` INT
-    ) RETURNS int(11)
+    ) RETURNS int(11) # -1 if teacher doesn't exists, otherwise 0
     NO SQL
 BEGIN
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
@@ -539,33 +603,34 @@ BEGIN
             teachers.DepartmentID = pDepartmentID
         WHERE teachers.ID = pTeacherID
         LIMIT 1;
-    RETURN ROW_COUNT()-1; # -1 if teacher doesn't exists, otherwise 0
+    RETURN ROW_COUNT()-1;
 END //
 
 
 
 DROP FUNCTION IF EXISTS CreateTeacher//
-CREATE FUNCTION `CreateTeacher`
-    (   `pLastName` VARCHAR(30) CHARSET utf8,
+CREATE FUNCTION `CreateTeacher` (
+        `pLastName` VARCHAR(30) CHARSET utf8,
         `pFirstName` VARCHAR(30) CHARSET utf8,
         `pSecondName` VARCHAR(30) CHARSET utf8,
         `pJobPositionID` INT,
         `pDepartmentID`  INT,
         `pActivationCode` VARCHAR(40) CHARSET utf8
-    ) RETURNS int(11)
+    ) RETURNS int(11) # 0 - success, <0 failed
     NO SQL
 BEGIN
     DECLARE vAccountID INT DEFAULT -1;
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
-# user role 2 - common teacher
-# add new account
+    # TODO: kill magic constants
+    # user role 2 - common teacher
+    # create account
     INSERT INTO `accounts`
         (Login , Password , EMail, UserRoleID, ActivationCode )
         VALUES  ( NULL, NULL, NULL, 2, pActivationCode);
     SET vAccountID = LAST_INSERT_ID();
 
-# add new teacher
+    # add new teacher
     INSERT INTO `teachers`
         (AccountID, LastName, FirstName, SecondName, JobPositionID, DepartmentID)
         VALUES  (vAccountID, pLastName, pFirstName, pSecondName, pJobPositionID, pDepartmentID);
@@ -573,50 +638,26 @@ BEGIN
 END //
 
 
-
 DROP FUNCTION IF EXISTS CreateTeacherByDepName//
-CREATE FUNCTION `CreateTeacherByDepName`
-    (   `pLastName` VARCHAR(30) CHARSET utf8,
+CREATE FUNCTION `CreateTeacherByDepName` (
+        `pLastName` VARCHAR(30) CHARSET utf8,
         `pFirstName` VARCHAR(30) CHARSET utf8,
         `pSecondName` VARCHAR(30) CHARSET utf8,
         `pDepartmentName` VARCHAR(200) CHARSET utf8,
         `pFacultyID` INT,
         `pActivationCode` VARCHAR(40) CHARSET utf8
-    )   RETURNS int(11)
+    )   RETURNS int(11) # 0 - success, < 0 - failed
     NO SQL
 BEGIN
-    DECLARE vAccountID, vChecker, vRoleID, vDepID INT DEFAULT -1;
+    DECLARE vAccountID, vRoleID, vDepID INT DEFAULT -1;
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
-    IF pDepartmentName = '' THEN
-        RETURN -1;
-    END IF;
-
-    # try to find a department with pDepartmentName
-    SELECT departments.ID
-        INTO vDepID
-        FROM `departments`
-        WHERE   (departments.Name = pDepartmentName AND departments.FacultyID = pFacultyID)
-        LIMIT 1;
-
-    IF vDepID <= 0 THEN
-        # pDepartmentName is not empty now
-        SET vChecker = CreateDepartment(pDepartmentName, pFacultyID);
-        IF vChecker < 0 THEN
-           RETURN -1;
-        END IF;
-        SET vDepID = LAST_INSERT_ID();
+    SET vDepID = CreateDepartment(pDepartmentName, pFacultyID);
+    IF vDepID < 0 THEN
+       RETURN -1;
     END IF;
 
-    INSERT INTO `accounts`
-        (Login , Password , EMail, UserRoleID, ActivationCode )
-        VALUES ( NULL, NULL, NULL, 2, pActivationCode);
-    SET vAccountID = LAST_INSERT_ID();
-
-    INSERT INTO `teachers`
-        (AccountID, LastName, FirstName, SecondName, JobPositionID, DepartmentID)
-        VALUES (vAccountID, pLastName, pFirstName, pSecondName, 12, vDepID);
-    RETURN 0;
+    RETURN CreateTeacher(pLastName, pFirstName, pSecondName, 12, vDepID, pActivationCode);
 END //
 
 
@@ -624,27 +665,26 @@ END //
 -- 0 - только чтение
 -- 1 - редактирование
 DROP FUNCTION IF EXISTS GetEditRightsForTeacher//
-CREATE FUNCTION `GetEditRightsForTeacher`   
-    (   `pTeacherID` INT,
+CREATE FUNCTION `GetEditRightsForTeacher` (
+        `pTeacherID` INT,
         `pDisciplineID` INT
-    )   RETURNS int(11)
+    ) RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vUserRole, vDiscTeacherID INT DEFAULT -1;
-              
-    SELECT disciplines_teachers.ID INTO vDiscTeacherID
-        FROM `disciplines_teachers`
-        WHERE disciplines_teachers.DisciplineID = pDisciplineID AND
-              disciplines_teachers.TeacherID = pTeacherID;
+    DECLARE vUserRole INT DEFAULT -1;
+    DECLARE vIsBound BOOLEAN;
 
-    IF vDiscTeacherID > 0 THEN
+    SET vIsBound = InternalIsTeacherBound(pTeacherID, pDisciplineID);
+    IF vIsBound > 0 THEN
         RETURN 1;
     END IF;
 
     SELECT accounts.UserRoleID INTO vUserRole
         FROM `teachers`
         INNER JOIN `accounts` ON teachers.AccountID=accounts.ID
-        WHERE teachers.ID = pTeacherID;
+        WHERE teachers.ID = pTeacherID
+        LIMIT 1;
+    # TODO: magic constants
     IF vUserRole = 4 THEN # 4 - сотрудник деканата
         RETURN 0;
     END IF;
@@ -658,31 +698,31 @@ END //
 # Label: students
 # -------------------------------------------------------------------------------------------
 
+# TODO: magic constants (UserRoleID)
+# TODO: group id instead num and grade
 DROP FUNCTION IF EXISTS CreateStudent//
-CREATE FUNCTION `CreateStudent`
-    (   `pLastName` VARCHAR(30) CHARSET utf8,
+CREATE FUNCTION `CreateStudent` (
+        `pLastName` VARCHAR(30) CHARSET utf8,
         `pFirstName` VARCHAR(30) CHARSET utf8,
         `pSecondName` VARCHAR(30) CHARSET utf8,
-        `pGradeID` INT, `pGroupNum` INT, `pFacultyID` INT,
-        `pActivationCode` VARCHAR(40) CHARSET utf8
+        `pGradeID` INT,
+        `pGroupNum` INT,
+        `pFacultyID` INT,
+        `pActivationCode` VARCHAR(40) CHARSET utf8,
+        `pSemesterID` INT
     )   RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vAccountID, vGroupID, vStudentID INT DEFAULT -1;
+    DECLARE vAccountID, vGroupID, vStudentID, vSemesterID INT DEFAULT -1;
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
-    # find group
-    SELECT view_groups.GroupID INTO vGroupID
-        FROM `view_groups`
-        WHERE   view_groups.FacultyID = pFacultyID AND
-                view_groups.GradeID = pGradeID AND
-                view_groups.GroupNum = pGroupNum
-        LIMIT 1;
+    SET vGroupID = GetGroup(pGradeID, pGroupNum, pFacultyID);
     IF vGroupID <= 0 THEN
         RETURN -1;
     END IF;
 
     # create new account
+    # UserRoleID 1 = student
     INSERT INTO `accounts`
         (Login , Password , EMail, UserRoleID, ActivationCode )
         VALUES ( NULL, NULL, NULL, 1, pActivationCode);
@@ -692,99 +732,41 @@ BEGIN
     INSERT INTO `students`
         (AccountID, LastName, FirstName, SecondName)
         VALUES  (vAccountID, pLastName, pFirstName, pSecondName);
+    SET vStudentID = LAST_INSERT_ID();
 
-    # bind group in current semester
-    INSERT INTO `students_groups`
-        (StudentID, GroupID, SemesterID)
-        VALUES (LAST_INSERT_ID(), vGroupID, @CurrentSemesterID);
-
-    RETURN 0;
+    RETURN ControlStudentGroup(vStudentID, vGroupID, FALSE, pSemesterID);
 END //
 
 
 # unlike fn CreateStudent, this can create all missing records (group, grade, specialization)
 DROP FUNCTION IF EXISTS CreateStudentEx//
-CREATE FUNCTION `CreateStudentEx`
-    (   `pLastName` VARCHAR(30) CHARSET utf8,
+CREATE FUNCTION `CreateStudentEx` (
+        `pLastName` VARCHAR(30) CHARSET utf8,
         `pFirstName` VARCHAR(30) CHARSET utf8,
         `pSecondName` VARCHAR(30) CHARSET utf8,
         `pGradeNum` INT,
         `pGroupNum` INT,
-        `pDegree` VARCHAR(20) CHARSET utf8,
+        `pDegree` enum('bachelor', 'master', 'specialist'),
         `pSpecName` VARCHAR(50) CHARSET utf8,
         `pFacultyID` INT,
-        `pActivationCode` VARCHAR(40) CHARSET utf8
+        `pActivationCode` VARCHAR(40) CHARSET utf8,
+        `pSemesterID` INT
     )   RETURNS int(11)
     NO SQL
 BEGIN
     DECLARE vAccountID, vGradeID, vSpecID, vGroupID INT DEFAULT -1;
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
-    # try to find grade
-    SELECT grades.ID INTO vGradeID
-        FROM `grades`
-        WHERE grades.Num = pGradeNum AND grades.Degree = pDegree
-        LIMIT 1;
-    # such grade doesn't exist
-    IF vGradeID <= 0 THEN
-        # insert new grade with pGradeNum and pDegree
-        INSERT INTO `grades`
-            (Num, Degree) VALUES (pGradeNum, pDegree);
-        SET vGradeID = LAST_INSERT_ID();
-    END IF;
-
-    # try to find group
-    SELECT view_groups.GroupID INTO vGroupID
-        FROM `view_groups`
-        WHERE view_groups.FacultyID = pFacultyID AND
-            view_groups.GroupNum = pGroupNum AND
-            view_groups.GradeID = vGradeID
-        LIMIT 1;
-
-    # group not found
-    IF vGroupID <= 0 THEN
-        # try to find specialization
-        SELECT specializations.ID INTO vSpecID
-            FROM `specializations`
-            WHERE   (specializations.Name = pSpecName OR
-                        (pSpecName = '' AND specializations.Name IS NULL)) AND
-                    specializations.FacultyID = pFacultyID
-            LIMIT 1;
-
-        # specialization not found
-        IF vSpecID <= 0 THEN
-            # create new specialization
-            INSERT INTO `specializations`
-                (Name, Abbr, FacultyID)
-                VALUES  (pSpecName, NULL, pFacultyID);
-            SET vSpecID = LAST_INSERT_ID();
-        END IF;
-
-        # create new group
-        INSERT INTO `study_groups`
-            (GradeID, GroupNum, SpecializationID)
-            VALUES (vGradeID, pGroupNum, vSpecID);
-        SET vGroupID = LAST_INSERT_ID();
-    END IF;
-
-    # TODO: user roles
-    # create account
-    INSERT INTO `accounts`
-        (Login, Password , EMail, UserRoleID, ActivationCode )
-        VALUES  ( NULL, NULL, NULL, 1, pActivationCode);
-    SET vAccountID = LAST_INSERT_ID();
-
-    # create student
-    INSERT INTO `students`
-        (AccountID, LastName, FirstName, SecondName)
-        VALUES  (vAccountID, pLastName, pFirstName, pSecondName);
-
-    # bind group in current semester
-    INSERT INTO `students_groups`
-        (StudentID, GroupID, SemesterID)
-        VALUES (LAST_INSERT_ID(), vGroupID, @CurrentSemesterID);
+    # get specialization id
+    INSERT INTO `specializations`
+        (Name, Abbr, FacultyID) VALUES  (pSpecName, NULL, pFacultyID)
+        ON DUPLICATE KEY UPDATE
+            specializations.ID = LAST_INSERT_ID(specializations.ID);
+    SET vSpecID = LAST_INSERT_ID();
 
-    RETURN ROW_COUNT()-1;
+    SET vGradeID = CreateGrade(pGradeNum, pDegree);
+    SET vGroupID = CreateGroup(vGradeID, pGroupNum, vSpecID, NULL);
+    RETURN CreateStudent(pLastName, pFirstName, pSecondName, vGradeID, pGroupNum, pFacultyID, pActivationCode, pSemesterID);
 END //
 
 
@@ -798,7 +780,8 @@ DROP FUNCTION IF EXISTS ControlStudentGroup//
 CREATE FUNCTION `ControlStudentGroup` (
         `pStudentID` INT,
         `pGroupID` INT,
-        `pState` BOOLEAN
+        `pState` BOOLEAN,
+        `pSemesterID` INT
     ) RETURNS int(11)
     NO SQL
 BEGIN
@@ -811,13 +794,15 @@ BEGIN
             SET students_groups.IsStudyLeave = TRUE,
                 students_groups.Date = CURDATE()
             WHERE students_groups.StudentID = pStudentID AND
-                  students_groups.SemesterID = @CurrentSemesterID
+                  students_groups.SemesterID = pSemesterID
             LIMIT 1;
     # attach to new group
     ELSE
         INSERT INTO `students_groups`
             (StudentID, GroupID, SemesterID)
-            VALUES(pStudentID, pGroupID, @CurrentSemesterID);
+            VALUES(pStudentID, pGroupID, pSemesterID)
+            ON DUPLICATE KEY UPDATE
+                students_groups.GroupID = pGroupID;
     END IF;
     RETURN ROW_COUNT()-1;
 END //
@@ -828,51 +813,71 @@ END //
 # -------------------------------------------------------------------------------------------
 
 
-
-DROP FUNCTION IF EXISTS AddDiscipline//
-CREATE FUNCTION `AddDiscipline`
-    (   `pTeacherID` INT, `pGradeID` INT, `pSubjectID` INT,
-        `pExamType` VARCHAR(30) CHARSET utf8,
-        `pLectureCount` INT, `pPracticeCount` INT, `pLabCount` INT,
-        `pFacultyID` INT,
-        `pSubtype` VARCHAR(30) CHARSET utf8 # enum('scientific_coursework', 'discipline_coursework' )
-    )   RETURNS int(11)
+DROP FUNCTION IF EXISTS Discipline_Create//
+CREATE FUNCTION `Discipline_Create` (
+    `pTeacherID` INT,
+    `pGradeID` INT,
+    `pSubjectID` INT,
+    `pExamType` enum('exam', 'credit', 'grading_credit'),
+    `pLectureCount` INT,
+    `pPracticeCount` INT,
+    `pLabCount` INT,
+    `pFacultyID` INT,
+    `pSemesterID` INT,
+    `pSubtype` enum('scientific_coursework', 'disciplinary_coursework')
+) RETURNS int(11)
     NO SQL
 BEGIN
     DECLARE vChecker, vDisciplineID INT DEFAULT -1;
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
+    # todo: make more flexible creation of coursework
+    # I mean, while creating scientific coursework
+    #    we don't have the SubjectID field, but we must.
+    #    346 is used as a default id for scientific courseworks.
+    #    This constant is duplicated in Model_Helper_CourseWorkBuilder
+
+    IF pSubtype IS NULL THEN
+        SET pSubjectID = 346;
+    END IF;
+
     # create discipline
     INSERT INTO `disciplines`
-        (AuthorID, GradeID, SubjectID, ExamType, LectureCount, PracticeCount,LabCount, SemesterID,FacultyID,Subtype)
-        VALUES  (   pTeacherID, pGradeID, pSubjectID, pExamType, pLectureCount, pPracticeCount, pLabCount,
-                    @CurrentSemesterID, pFacultyID, pSubtype);
+        (AuthorID, GradeID, SubjectID, ExamType,
+        LectureCount, PracticeCount,LabCount,
+        SemesterID, FacultyID, Subtype)
+        VALUES (
+            pTeacherID, pGradeID, pSubjectID, pExamType,
+            pLectureCount, pPracticeCount, pLabCount,
+            pSemesterID, pFacultyID, pSubtype
+        );
     SET vDisciplineID = LAST_INSERT_ID();
 
-    # bind teacher(author)
-    INSERT INTO `disciplines_teachers`
-        (DisciplineID,TeacherID)
-        VALUES (vDisciplineID, pTeacherID);
+
+    SET vChecker = Discipline_BindTeacher(vDisciplineID, pTeacherID);
 
     # add exam and extra modules
     IF pExamType = 'exam' THEN
         SET vChecker = AddModuleExam(pTeacherID, vDisciplineID);
     END IF;
     SET vChecker = AddModuleExtra(pTeacherID, vDisciplineID);
+
     RETURN vDisciplineID;
 END //
 
 
 
 DROP FUNCTION IF EXISTS ChangeDisciplineSubject//
-CREATE FUNCTION `ChangeDisciplineSubject`
-    (`pTeacherID` INT, `pDisciplineID` INT, `pSubjectID` INT
+CREATE FUNCTION `ChangeDisciplineSubject` (
+        `pTeacherID` INT,
+        `pDisciplineID` INT,
+        `pSubjectID` INT
     ) RETURNS int(11)
     NO SQL
 BEGIN
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
-    IF NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID) OR
+    IF  NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID) OR
         InternalIsMapLocked(pDisciplineID)
     THEN
         RETURN -1;
@@ -887,15 +892,16 @@ END //
 
 
 
-
 DROP FUNCTION IF EXISTS GetMilestone//
-CREATE FUNCTION `GetMilestone`
-    (`pFacultyID` INT, `pSemesterID` INT
+CREATE FUNCTION `GetMilestone` (
+        `pFacultyID` INT,
+        `pSemesterID` INT
     ) RETURNS int(11)
     NO SQL
 BEGIN
     DECLARE vMilestone, vCounter INT DEFAULT 0;
 
+    # get most frequent milestone
     SELECT COUNT(*) AS 'cnt', disciplines.Milestone
         INTO vCounter, vMilestone
         FROM `disciplines`
@@ -911,8 +917,10 @@ END //
 
 
 DROP FUNCTION IF EXISTS ChangeDisciplineGrade//
-CREATE FUNCTION `ChangeDisciplineGrade`
-    (`pTeacherID` INT, `pDisciplineID` INT, `pGradeID` INT
+CREATE FUNCTION `ChangeDisciplineGrade` (
+        `pTeacherID` INT,
+        `pDisciplineID` INT,
+        `pGradeID` INT
     ) RETURNS int(11)
     NO SQL
 BEGIN
@@ -925,11 +933,7 @@ BEGIN
         RETURN -1;
     END IF;
 
-    # get current grade
-    SELECT disciplines.GradeID INTO vCurGradeID
-        FROM `disciplines`
-        WHERE disciplines.ID = pDisciplineID
-        LIMIT 1;
+    SET vCurGradeID = GetDisciplineProperty(pDisciplineID, 'grade');
     IF vCurGradeID = pGradeID THEN
         RETURN 0;
     END IF;
@@ -950,13 +954,15 @@ END //
 
 
 DROP FUNCTION IF EXISTS ChangeDisciplineControl//
-CREATE FUNCTION `ChangeDisciplineControl`
-    (   `pTeacherID` INT, `pDisciplineID` INT,
-        `pExamType` VARCHAR(30) CHARSET utf8
+CREATE FUNCTION `ChangeDisciplineControl` (
+        `pTeacherID` INT,
+        `pDisciplineID` INT,
+        `pExamType` enum('exam', 'credit', 'grading_credit')
     )   RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vOldExamType, vChecker, vExtraMax, vExtraID INT DEFAULT -1;
+    DECLARE vChecker, vExtraMax, vExtraID INT DEFAULT -1;
+    DECLARE vOldExamType enum('exam', 'credit', 'grading_credit');
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
     IF  InternalIsMapLocked(pDisciplineID) OR
@@ -967,41 +973,41 @@ BEGIN
 
     # get exam type and extra module ID
     SELECT disciplines.ExamType, modules.ID INTO vOldExamType, vExtraID
-        FROM `disciplines`
-        INNER JOIN `modules` ON modules.Type = 'extra' AND
-                                modules.DisciplineID = pDisciplineID
-        WHERE disciplines.ID = pDisciplineID
+        FROM `modules`
+        INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID
+        WHERE   modules.DisciplineID = pDisciplineID AND
+                modules.Type = 'extra'
         LIMIT 1;
     IF vExtraID <= 0 THEN
         RETURN -1;
     END IF;
-    # check that exam type really changed
-    IF vOldExamType = 'exam' XOR pExamType != 'exam' THEN
-        RETURN 0;
-    END IF;
 
-
-    IF pExamType = 'exam' THEN # change to exam
-        SET vExtraMax = 7;
-        # count discipline's current max rate
-        SELECT view_disciplines_results.DisciplineRateMax INTO vChecker
-            FROM `view_disciplines_results`
-            WHERE view_disciplines_results.DisciplineID = pDisciplineID
-            LIMIT 1;
-        # can't add exam module
-        IF vChecker >= 61 THEN
-            RETURN 1;
+    # check type changing: exam <-> credit/grading_credit
+    IF NOT (vOldExamType = 'exam' XOR pExamType != 'exam') THEN
+
+        # TODO: extract method addExtraModule
+        IF pExamType = 'exam' THEN # change to exam
+            SET vExtraMax = 7;
+            # count discipline's current max rate
+            SELECT view_disciplines_results.DisciplineRateMax INTO vChecker
+                FROM `view_disciplines_results`
+                WHERE view_disciplines_results.DisciplineID = pDisciplineID
+                LIMIT 1;
+
+            IF vChecker >= 61 THEN # can't add exam module ( > 100 points)
+                RETURN 1;
+            END IF;
+            SET vChecker = AddModuleExam(pTeacherID, pDisciplineID);
+
+            # delete extra submodules(only 1 extra for exam)
+            DELETE FROM `submodules`
+                WHERE submodules.OrderNum > 1 AND submodules.ModuleID = vExtraID;
+        ELSE # change to credit
+            SET vExtraMax = 29;
+            SET vChecker = DeleteModuleExam(pTeacherID, pDisciplineID);
+            # 2 extra submodules (1 already created for exam)
+            SET vChecker = AddSubmodule(pTeacherID, vExtraID, vExtraMax, '', NULL, 'LandmarkControl');
         END IF;
-        SET vChecker = AddModuleExam(pTeacherID, pDisciplineID);
-
-        # delete extra submodules(only 1 extra for exam)
-        DELETE FROM `submodules`
-            WHERE submodules.OrderNum > 1 AND submodules.ModuleID = vExtraID;
-    ELSE # change to credit
-        SET vExtraMax = 29;
-        SET vChecker = DeleteModuleExam(pTeacherID, pDisciplineID);
-        # 2 extra submodules (1 created for exam)
-        SET vChecker = AddSubmodule(pTeacherID, vExtraID, vExtraMax, '', NULL, 'LandmarkControl');
     END IF;
 
     # set new exam type
@@ -1009,6 +1015,7 @@ BEGIN
         SET disciplines.ExamType = pExamType
         WHERE disciplines.ID = pDisciplineID
         LIMIT 1;
+
     # set max rate for extra
     UPDATE `submodules`
         SET submodules.MaxRate = vExtraMax
@@ -1017,9 +1024,11 @@ BEGIN
 END //
 
 DROP FUNCTION IF EXISTS ChangeDisciplineHours//
-CREATE FUNCTION `ChangeDisciplineHours`
-    (   `pTeacherID` INT, `pDisciplineID` INT,
-        `pHours` INT, `pType` INT
+CREATE FUNCTION `ChangeDisciplineHours` (
+        `pTeacherID` INT,
+        `pDisciplineID` INT,
+        `pHours` INT,
+        `pType` INT
         # Type: 0 - Practice Hours, 1 - Lecture Hours, 2 - Lab Hours
     )   RETURNS int(11)
     NO SQL
@@ -1051,13 +1060,17 @@ END //
 
 
 DROP FUNCTION IF EXISTS BindGroup//
-CREATE FUNCTION `BindGroup`
-    (`pTeacherID` INT, `pDisciplineID` INT, `pGroupID` INT
+CREATE FUNCTION `BindGroup` (
+        `pTeacherID` INT,
+        `pDisciplineID` INT,
+        `pGroupID` INT
     ) RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vChecker, vSemesterID INT DEFAULT -1;
+    DECLARE vSemesterID INT DEFAULT -1;
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -3;
+    SET @isAttached := -1;
+
 
     # 1. check if AccessedTeacher is author
     IF  NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID) OR
@@ -1066,47 +1079,43 @@ BEGIN
         RETURN -1;
     END IF;
 
-    # 2. check if group is bound to discipline
-    SELECT disciplines_groups.ID INTO vChecker
-        FROM `disciplines_groups`
-        WHERE   disciplines_groups.GroupID = pGroupID AND
-                disciplines_groups.DisciplineID = pDisciplineID
-        LIMIT 1;
-    IF vChecker > 0 THEN
-        RETURN 1;
-    END IF;
+    # 2. bind whole group
+    INSERT INTO `disciplines_groups`
+        (DisciplineID, GroupID)
+        VALUES ( pDisciplineID, pGroupID )
+        ON DUPLICATE KEY UPDATE
+            disciplines_groups.ID = ( @isAttached := LAST_INSERT_ID(disciplines_groups.ID) );
 
-    SELECT disciplines.SemesterID INTO vSemesterID
-        FROM `disciplines`
-        WHERE disciplines.ID = pDisciplineID
-        LIMIT 1;
+    IF @isAttached > 0 THEN # group was attached
+        SET vSemesterID = GetDisciplineProperty(pDisciplineID, 'semester');
 
-    # 3. delete students of this group which were bound to discipline before
-    DELETE FROM `disciplines_students`
-        WHERE disciplines_students.DisciplineID = pDisciplineID AND
-            disciplines_students.StudentID IN
-                (SELECT students_groups.StudentID
+        # 3. delete students of this group which were bound to discipline before
+        DELETE FROM `disciplines_students`
+        WHERE   disciplines_students.DisciplineID = pDisciplineID AND
+                disciplines_students.StudentID IN (
+                    SELECT students_groups.StudentID
                     FROM `students_groups`
                     WHERE   students_groups.GroupID = pGroupID AND
                             students_groups.SemesterID = vSemesterID
                 );
+        RETURN 1;
+    END IF;
 
-    # 4. bind whole group
-    INSERT INTO `disciplines_groups`
-        (DisciplineID, GroupID)
-        VALUES (pDisciplineID, pGroupID );
     RETURN 0;
 END //
 
 
 
 DROP FUNCTION IF EXISTS BindStudent//
-CREATE FUNCTION `BindStudent`
-    (   `pTeacherID` INT, `pDisciplineID` INT, `pStudentID` INT
+CREATE FUNCTION `BindStudent` (
+        `pTeacherID` INT,
+        `pDisciplineID` INT,
+        `pStudentID` INT
     )   RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vInGroup, vChecker, vGroupID, vTemp INT DEFAULT -1;
+    DECLARE vChecker, vStudentGroupID, vTemp, vSemesterID INT DEFAULT -1;
+    DECLARE vInGroup BOOLEAN DEFAULT FALSE;
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
     # 1. check if AccessedTeacher is author
@@ -1114,96 +1123,97 @@ BEGIN
         RETURN -1;
     END IF;
 
-    # 2. check if student's group is bound yet
-    SELECT disciplines_groups.ID INTO vInGroup
-        FROM `students_groups`
-            INNER JOIN `disciplines_groups` ON disciplines_groups.DisciplineID = pDisciplineID AND
-                                               disciplines_groups.GroupID = students_groups.GroupID
-            WHERE students_groups.StudentID = pStudentID AND
-                  students_groups.SemesterID = @CurrentSemesterID
+    SET vSemesterID = GetDisciplineProperty(pDisciplineID, 'semester');
+    SET vStudentGroupID = GetStudentGroup(pStudentID, vSemesterID);
 
-            LIMIT 1;
+    # 2. check if student's group is bound yet
+    SET vInGroup = EXISTS(
+        SELECT * FROM `disciplines_groups`
+            WHERE disciplines_groups.DisciplineID = pDisciplineID AND
+                  disciplines_groups.GroupID = vStudentGroupID
+            LIMIT 1
+    );
 
-    # try to remove detached attribute
-    IF vInGroup > 0 THEN
+    # 3. bind student
+    IF vInGroup THEN # student in group -> try to remove detached attribute
         DELETE FROM `disciplines_students`
-            WHERE disciplines_students.DisciplineID = pDisciplineID AND
-                disciplines_students.StudentID = pStudentID
+            WHERE   disciplines_students.DisciplineID = pDisciplineID AND
+                    disciplines_students.StudentID = pStudentID
             LIMIT 1;
-        RETURN 0;
+    ELSE # bind stand alone student ;(
+        INSERT INTO `disciplines_students`
+            (DisciplineID, StudentID, Type)
+            VALUES (pDisciplineID, pStudentID, 'attach')
+            ON DUPLICATE KEY UPDATE
+                disciplines_students.Type = 'attach';
     END IF;
 
-
-    # 3. try bind student
-    INSERT INTO `disciplines_students`
-        (DisciplineID, StudentID, Type)
-        VALUES (pDisciplineID, pStudentID, 'attach')
-        # update stub/ already bounded
-        ON DUPLICATE KEY UPDATE
-            disciplines_students.StudentID = disciplines_students.StudentID;
     RETURN 0;
 END //
 
 
 
 DROP FUNCTION IF EXISTS UnbindGroup//
-CREATE FUNCTION `UnbindGroup`
-    (   `pTeacherID` INT, `pDisciplineID` INT, `pGroupID` INT
-    )   RETURNS int(11)
+CREATE FUNCTION `UnbindGroup` (
+        `pTeacherID` INT,
+        `pDisciplineID` INT,
+        `pGroupID` INT
+    ) RETURNS int(11)
     NO SQL
 BEGIN
     DECLARE vSemesterID INT DEFAULT -1;
 
-    IF NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID) OR InternalIsMapLocked(pDisciplineID)THEN
+    IF NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID) OR InternalIsMapLocked(pDisciplineID) THEN
         RETURN -1;
     END IF;
 
     # detach group from the discipline
     DELETE FROM `disciplines_groups`
-        WHERE disciplines_groups.DisciplineID = pDisciplineID AND
-            disciplines_groups.GroupID = pGroupID
-    LIMIT 1;
-
-
-    SELECT disciplines.SemesterID INTO vSemesterID
-        FROM `disciplines`
-        WHERE disciplines.ID = pDisciplineID
+        WHERE   disciplines_groups.DisciplineID = pDisciplineID AND
+                disciplines_groups.GroupID = pGroupID
         LIMIT 1;
 
+    SET vSemesterID = GetDisciplineProperty(pDisciplineID, 'semester');
+
     # delete attached, and detached (doesn't take disc in any case)
     DELETE FROM `disciplines_students`
     WHERE disciplines_students.DisciplineID = pDisciplineID AND
-          disciplines_students.StudentID IN
-            (SELECT students_groups.StudentID
-             FROM `students_groups`
-             WHERE   students_groups.GroupID = pGroupID AND
-                     students_groups.SemesterID = vSemesterID);
+          disciplines_students.StudentID IN (
+              SELECT students_groups.StudentID
+                 FROM `students_groups`
+                 WHERE  students_groups.GroupID = pGroupID AND
+                        students_groups.SemesterID = vSemesterID
+          );
     RETURN 0;
 END //
 
 
 
 DROP FUNCTION IF EXISTS UnbindStudent//
-CREATE FUNCTION `UnbindStudent`
-    (`pTeacherID` INT, `pDisciplineID` INT, `pStudentID` INT
+CREATE FUNCTION `UnbindStudent` (
+        `pTeacherID` INT,
+        `pDisciplineID` INT,
+        `pStudentID` INT
     ) RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vInGroup INT DEFAULT -1;
+    DECLARE vInGroup, vStudentGroupID, vSemesterID INT DEFAULT -1;
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
+
     IF  NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID) THEN
         RETURN -1;
     END IF;
 
-    # try to get general group, if student in it.
-    SELECT disciplines_groups.ID INTO vInGroup
-        FROM `students`
-        INNER JOIN `students_groups` ON students_groups.StudentID = students.ID AND
-                                        students_groups.SemesterID = @CurrentSemesterID
-        INNER JOIN `disciplines_groups` ON disciplines_groups.DisciplineID = pDisciplineID AND
-                                           disciplines_groups.GroupID = students_groups.GroupID
-        WHERE students.ID = pStudentID
-        LIMIT 1;
+    SET vSemesterID = GetDisciplineProperty(pDisciplineID, 'semester');
+    SET vStudentGroupID = GetStudentGroup(pStudentID, vSemesterID);
+
+    # 2. check if student's group is bound yet
+    SET vInGroup = EXISTS(
+        SELECT * FROM `disciplines_groups`
+        WHERE disciplines_groups.DisciplineID = pDisciplineID AND
+              disciplines_groups.GroupID = vStudentGroupID
+        LIMIT 1
+    );
 
     IF vInGroup > 0 THEN # student in general group
         INSERT INTO `disciplines_students`
@@ -1211,71 +1221,64 @@ BEGIN
             VALUES (pDisciplineID, pStudentID, 'detach');
     ELSE
         DELETE FROM `disciplines_students`
-        WHERE disciplines_students.DisciplineID = pDisciplineID AND
-            disciplines_students.StudentID = pStudentID
-        LIMIT 1;
+            WHERE   disciplines_students.DisciplineID = pDisciplineID AND
+                    disciplines_students.StudentID = pStudentID
+            LIMIT 1;
     END IF;
     RETURN 0;
 END //
 
 
 
-DROP FUNCTION IF EXISTS BindTeacher//
-CREATE FUNCTION `BindTeacher`
-    (`pAuthorTeacherID` INT, `pBindingTeacherID` INT, `pDisciplineID` INT
-    ) RETURNS int(11)
+DROP FUNCTION IF EXISTS Discipline_BindTeacher//
+CREATE FUNCTION `Discipline_BindTeacher` (
+    `pDisciplineID` INT,
+    `pBindingTeacherID` INT
+) RETURNS int(11)
     NO SQL
 BEGIN
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
-    IF  NOT InternalIsTeacherAuthor(pAuthorTeacherID, pDisciplineID) THEN
-        RETURN -1;
-    END IF;
 
     # try to insert BindingTeacher in access list
     INSERT INTO `disciplines_teachers`
         (DisciplineID, TeacherID)
         VALUES (pDisciplineID, pBindingTeacherID)
         ON DUPLICATE KEY UPDATE # just stub
-            disciplines_teachers.TeacherID = disciplines_teachers.TeacherID;
+            disciplines_teachers.ID = LAST_INSERT_ID(disciplines_teachers.ID);
     RETURN 0;
 END //
 
 
 
 DROP FUNCTION IF EXISTS UnbindTeacher//
-CREATE FUNCTION `UnbindTeacher`
-    (   `pAuthorTeacherID` INT, `pBindingTeacher` INT, `pDisciplineID` INT
-    ) RETURNS int(11)
+DROP FUNCTION IF EXISTS Discipline_UnbindTeacher//
+CREATE FUNCTION `Discipline_UnbindTeacher` (
+    `pDisciplineID` INT,
+    `pBindingTeacher` INT
+) RETURNS int(11)
     NO SQL
 BEGIN
-    IF pAuthorTeacherID = pBindingTeacher OR
-       NOT InternalIsTeacherAuthor(pAuthorTeacherID, pDisciplineID)
-    THEN
-        RETURN -1;
-    END IF;
-
     DELETE FROM `disciplines_teachers`
         WHERE   disciplines_teachers.DisciplineID = pDisciplineID AND
-                disciplines_teachers.TeacherID = pBindingTeacher;
+                disciplines_teachers.TeacherID = pBindingTeacher
+        LIMIT 1;
     RETURN ROW_COUNT()-1;
 END //
 
 
 # assign new author to discipline
 DROP FUNCTION IF EXISTS DelegateDiscipline//
-CREATE FUNCTION `DelegateDiscipline`
-    (   `pAuthorTeacherID` INT, `pNewAuthorID` INT, `pDisciplineID` INT
-    )   RETURNS int(11)
+DROP FUNCTION IF EXISTS Discipline_Delegate//
+CREATE FUNCTION `Discipline_Delegate` (
+    `pDisciplineID` INT,
+    `pNewAuthorID` INT
+) RETURNS int(11)
     NO SQL
 BEGIN
+    DECLARE vTemp INT DEFAULT 0;
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
-    IF  pAuthorTeacherID = pNewAuthorID OR
-        NOT InternalIsTeacherAuthor(pAuthorTeacherID, pDisciplineID) OR
-        NOT InternalIsTeacherBounded(pNewAuthorID, pDisciplineID)
-    THEN
-        RETURN -1;
-    END IF;
+    SET vTemp = Discipline_BindTeacher(pDisciplineID, pNewAuthorID);
 
     UPDATE `disciplines`
         SET disciplines.AuthorID = pNewAuthorID
@@ -1287,9 +1290,10 @@ END //
 
 # erase all discipline's rates(and logs), unlock discipline for editing
 DROP FUNCTION IF EXISTS ClearDiscipline//
-CREATE FUNCTION `ClearDiscipline`
-    (   `pAuthorTeacherID` INT, `pDisciplineID` INT
-    )   RETURNS int(11)
+CREATE FUNCTION `ClearDiscipline` (
+        `pAuthorTeacherID` INT,
+        `pDisciplineID` INT
+    ) RETURNS int(11)
     NO SQL
 BEGIN
     IF NOT InternalIsTeacherAuthor(pAuthorTeacherID, pDisciplineID) THEN
@@ -1322,37 +1326,19 @@ END //
 
 
 DROP FUNCTION IF EXISTS DeleteDiscipline//
-CREATE FUNCTION `DeleteDiscipline`
-    (   `pAuthorTeacherID` INT, `pDisciplineID` INT
-    )   RETURNS int(11)
+DROP FUNCTION IF EXISTS Discipline_Delete//
+CREATE FUNCTION `Discipline_Delete` (
+        `pDisciplineID` INT
+    ) RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vTemp INT DEFAULT -1;
-    IF NOT InternalIsTeacherAuthor(pAuthorTeacherID, pDisciplineID) THEN
-        RETURN -1;
-    END IF;
-
-    SELECT disciplines.IsLocked INTO vTemp
-        FROM `disciplines`
-        WHERE disciplines.ID = pDisciplineID
-        LIMIT 1;
-    IF vTemp != 0 THEN
-        RETURN -1;
-    END IF;
-
-    # delete only if discipline cleared(doesn't exists related rating's records)
-    SET vTemp = CountRatings(pAuthorTeacherID, pDisciplineID);
-    IF vTemp > 0 THEN
-        RETURN -1;
-    END IF;
-
     # delete roadmap
     DELETE FROM `submodules`
-        WHERE submodules.ModuleID IN
-            (SELECT modules.ID
+        WHERE submodules.ModuleID IN (
+            SELECT modules.ID
                 FROM `modules`
                 WHERE modules.DisciplineID = pDisciplineID
-            );
+        );
     DELETE FROM `modules`
         WHERE modules.DisciplineID = pDisciplineID;
 
@@ -1375,24 +1361,18 @@ END //
 
 # get count of related with discipline records in rating_table
 DROP FUNCTION IF EXISTS CountRatings//
-CREATE FUNCTION `CountRatings`
-    (   `pTeacherID` INT, `pDisciplineID` INT
-    )   RETURNS int(11)
+DROP FUNCTION IF EXISTS Discipline_CountRatings//
+CREATE FUNCTION `Discipline_CountRatings` (
+        `pDisciplineID` INT
+    ) RETURNS int(11)
     NO SQL
 BEGIN
     DECLARE vRes INT DEFAULT 0;
 
-    IF  NOT InternalIsTeacherBounded(pTeacherID, pDisciplineID) THEN
-        RETURN -1;
-    END IF;
-
-    SELECT COUNT(rating_table.StudentID)
-        INTO vRes
-        FROM `rating_table`
-        INNER JOIN `submodules` ON rating_table.SubModuleID = submodules.ID
-        INNER JOIN `modules` ON submodules.ModuleID = modules.ID
-        WHERE modules.DisciplineID = pDisciplineID
-        LIMIT 1;
+    SELECT COUNT(rating_table.StudentID) INTO vRes
+        FROM `view_roadmap`
+        LEFT JOIN `rating_table` ON rating_table.SubmoduleID = view_roadmap.SubmoduleID
+        WHERE view_roadmap.DisciplineID = pDisciplineID;
 
     RETURN vRes;
 END //
@@ -1400,9 +1380,11 @@ END //
 
 
 DROP FUNCTION IF EXISTS RestrictAfterMilestone//
-CREATE FUNCTION `RestrictAfterMilestone`
-    (   `pTeacherID` INT, `pDisciplineID` INT, `pMilestone` INT
-    )   RETURNS int(11)
+CREATE FUNCTION `RestrictAfterMilestone` (
+        `pTeacherID` INT,
+        `pDisciplineID` INT,
+        `pMilestone` INT
+    ) RETURNS int(11)
     NO SQL
 BEGIN
     UPDATE `disciplines`
@@ -1415,33 +1397,36 @@ END //
 
 
 DROP FUNCTION IF EXISTS RestrictAfterMilestoneForCredits//
-CREATE FUNCTION `RestrictAfterMilestoneForCredits`  (   `pTeacherID` INT,
-                                                        `pFacultyID` INT,
-                                                        `pMilestone` INT
-                                                    )   RETURNS int(11)
+CREATE FUNCTION `RestrictAfterMilestoneForCredits` (
+        `pTeacherID` INT,
+        `pFacultyID` INT,
+        `pMilestone` INT,
+        `pSemesterID` INT
+    ) RETURNS int(11)
     NO SQL
 BEGIN
     UPDATE `disciplines`
         SET disciplines.MilestoneDate = CURDATE(),
             disciplines.Milestone = pMilestone
-        WHERE   disciplines.SemesterID = @CurrentSemesterID AND
-                ( disciplines.ExamType = 'credit' OR disciplines.ExamType = 'grading_credit') AND
-                disciplines.FacultyID= pFacultyID;
+        WHERE   disciplines.FacultyID= pFacultyID AND
+                disciplines.SemesterID = pSemesterID AND
+                ( disciplines.ExamType = 'credit' OR disciplines.ExamType = 'grading_credit');
     RETURN 0;
 END //
 
+
+
 # -------------------------------------------------------------------------------------------
 # Label: modules
 # Label: roadmap
 # -------------------------------------------------------------------------------------------
 
-
-
 DROP FUNCTION IF EXISTS ChangeModuleName//
-CREATE FUNCTION `ChangeModuleName`
-    (   `pTeacherID` INT, `pModuleID` INT,
+CREATE FUNCTION `ChangeModuleName` (
+        `pTeacherID` INT,
+        `pModuleID` INT,
         `pName` VARCHAR(200) CHARSET utf8
-    )   RETURNS int(11)
+    ) RETURNS int(11)
     NO SQL
 BEGIN
     UPDATE `modules`
@@ -1456,8 +1441,9 @@ END //
 
 
 DROP FUNCTION IF EXISTS AddModule//
-CREATE FUNCTION `AddModule`
-    (   `pTeacherID` INT, `pDisciplineID` INT,
+CREATE FUNCTION `AddModule` (
+        `pTeacherID` INT,
+        `pDisciplineID` INT,
         `pName` VARCHAR(200) CHARSET utf8
     ) RETURNS int(11)
     NO SQL
@@ -1476,7 +1462,7 @@ BEGIN
         FROM `modules`
         WHERE   modules.DisciplineID = pDisciplineID AND modules.Type = 'regular'
         LIMIT 1;
-    IF vOrderNum IS NULL THEN
+    IF vOrderNum IS NULL THEN # TODO: check unreachable code
         SET vOrderNum = 1;
     END IF;
 
@@ -1489,25 +1475,27 @@ END //
 
 
 DROP FUNCTION IF EXISTS AddModuleExam//
-CREATE FUNCTION `AddModuleExam`
-    (`pTeacherID` INT, `pDisciplineID` INT
-    )   RETURNS int(11)
+CREATE FUNCTION `AddModuleExam` (
+        `pTeacherID` INT,
+        `pDisciplineID` INT
+    ) RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vChecker, vModule INT DEFAULT -1;
+    DECLARE vModule, vChecker INT DEFAULT -1;
+    DECLARE vIsExamExists BOOLEAN;
     IF  NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID) OR
         InternalIsMapLocked(pDisciplineID)
     THEN
         RETURN -1;
     END IF;
 
-    # check exam module existence
-    SELECT modules.ID
-        INTO vChecker
-        FROM `modules`
-        WHERE   modules.DisciplineID = pDisciplineID AND
-                modules.Type = 'exam';
-    IF vChecker > 0 THEN
+    SET vIsExamExists = EXISTS(
+        SELECT * FROM `modules`
+            WHERE   modules.DisciplineID = pDisciplineID AND
+                    modules.Type = 'exam'
+            LIMIT 1
+    );
+    IF vIsExamExists THEN
         RETURN -2;
     END IF;
 
@@ -1525,8 +1513,9 @@ END //
 
 
 DROP FUNCTION IF EXISTS AddModuleExtra//
-CREATE FUNCTION `AddModuleExtra`
-    (   `pTeacherID` INT, `pDisciplineID` INT
+CREATE FUNCTION `AddModuleExtra` (
+        `pTeacherID` INT,
+        `pDisciplineID` INT
     ) RETURNS int(11)
     NO SQL
 BEGIN
@@ -1553,8 +1542,7 @@ BEGIN
 
 
     # get discipline exam type
-    SELECT  modules.ID, disciplines.ExamType
-        INTO vModule, vType
+    SELECT  modules.ID, disciplines.ExamType INTO vModule, vType
         FROM `modules`
         INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID
         WHERE   modules.DisciplineID = pDisciplineID AND
@@ -1580,9 +1568,10 @@ END //
 
 
 DROP FUNCTION IF EXISTS DeleteModule//
-CREATE FUNCTION `DeleteModule`
-    (   `pTeacherID` INT, `pModuleID` INT
-    )   RETURNS int(11)
+CREATE FUNCTION `DeleteModule` (
+        `pTeacherID` INT,
+        `pModuleID` INT
+    ) RETURNS int(11)
     NO SQL
 BEGIN
     DECLARE vDisciplineID INT DEFAULT -1;
@@ -1621,9 +1610,10 @@ END //
 
 
 DROP FUNCTION IF EXISTS DeleteModuleExam//
-CREATE FUNCTION `DeleteModuleExam`
-    (   `pTeacherID` INT, `pDisciplineID` INT
-    )   RETURNS int(11)
+CREATE FUNCTION `DeleteModuleExam` (
+        `pTeacherID` INT,
+        `pDisciplineID` INT
+    ) RETURNS int(11)
     NO SQL
 BEGIN
     DECLARE vExamModuleID INT DEFAULT -1;
@@ -1655,9 +1645,11 @@ END //
 
 
 DROP FUNCTION IF EXISTS SwapModuleOrder//
-CREATE FUNCTION `SwapModuleOrder`
-    (   `pTeacherID` INT, `pModuleID1` INT, `pModuleID2` INT
-    )   RETURNS int(11)
+CREATE FUNCTION `SwapModuleOrder` (
+        `pTeacherID` INT,
+        `pModuleID1` INT,
+        `pModuleID2` INT
+    ) RETURNS int(11)
     NO SQL
 BEGIN
     DECLARE vChecker, vOrder1, vOrder2,
@@ -1710,9 +1702,10 @@ END //
 
 
 DROP FUNCTION IF EXISTS AddModuleBonus//
-CREATE FUNCTION `AddModuleBonus`
-    (   `pTeacherID` INT, `pDisciplineID` INT
-    )   RETURNS int(11)
+CREATE FUNCTION `AddModuleBonus` (
+        `pTeacherID` INT,
+        `pDisciplineID` INT
+    )   RETURNS INT(11)
     NO SQL
 BEGIN
     DECLARE vChecker, vModuleID INT DEFAULT -1;
@@ -1742,8 +1735,9 @@ END //
 
 
 DROP FUNCTION IF EXISTS DeleteModuleBonus//
-CREATE FUNCTION `DeleteModuleBonus`
-    (   `pTeacherID` INT, `pDisciplineID` INT
+CREATE FUNCTION `DeleteModuleBonus` (
+        `pTeacherID` INT,
+        `pDisciplineID` INT
     ) RETURNS int(11)
     NO SQL
 BEGIN
@@ -1782,12 +1776,12 @@ END //
 # -------------------------------------------------------------------------------------------
 
 DROP FUNCTION IF EXISTS ChangeSubmoduleMaxAndControl//
-CREATE FUNCTION `ChangeSubmoduleMaxAndControl`
-    (   `pTeacherID`     INT,
+CREATE FUNCTION `ChangeSubmoduleMaxAndControl` (
+        `pTeacherID`     INT,
         `pSubmoduleID`   INT,
         `pMaxRate`       INT,
         `pControlType`   VARCHAR(30) CHARSET utf8
-    )   RETURNS int(11)
+    ) RETURNS int(11)
     NO SQL
 BEGIN
     DECLARE vChecker, vDisciplineID, vIsLocked, vNewDiscMaxRate, vCurRate INT DEFAULT -1;
@@ -1820,11 +1814,11 @@ END //
 
 
 DROP FUNCTION IF EXISTS ChangeSubmoduleName//
-CREATE FUNCTION `ChangeSubmoduleName`
-    (   `pTeacherID` INT,
+CREATE FUNCTION `ChangeSubmoduleName` (
+        `pTeacherID` INT,
         `pSubmoduleID` INT,
         `pName` VARCHAR(200) CHARSET utf8
-    )   RETURNS int(11)
+    ) RETURNS int(11)
     NO SQL
 BEGIN
     DECLARE vIsLocked INT DEFAULT -1;
@@ -1850,11 +1844,11 @@ END //
 
 
 DROP FUNCTION IF EXISTS ChangeSubmoduleDescription//
-CREATE FUNCTION `ChangeSubmoduleDescription`
-    (   `pTeacherID` INT,
+CREATE FUNCTION `ChangeSubmoduleDescription` (
+        `pTeacherID` INT,
         `pSubmoduleID` INT,
         `pDescription` VARCHAR(200) CHARSET utf8
-    )   RETURNS int(11)
+    ) RETURNS int(11)
     NO SQL
 BEGIN
     DECLARE vIsLocked INT DEFAULT -1;
@@ -1881,8 +1875,9 @@ END //
 
 
 DROP FUNCTION IF EXISTS DeleteSubmodule//
-CREATE FUNCTION `DeleteSubmodule`
-    (   `pTeacherID` INT, `pSubmoduleID` INT
+CREATE FUNCTION `DeleteSubmodule` (
+        `pTeacherID` INT,
+        `pSubmoduleID` INT
     ) RETURNS int(11)
     NO SQL
 BEGIN
@@ -1919,12 +1914,14 @@ END //
 
 
 DROP FUNCTION IF EXISTS AddSubmodule//
-CREATE FUNCTION `AddSubmodule`
-    (   `pTeacherID` INT, `pModuleID` INT, `pMaxRate` INT,
+CREATE FUNCTION `AddSubmodule` (
+        `pTeacherID` INT,
+        `pModuleID` INT,
+        `pMaxRate` INT,
         `pName` VARCHAR(200) CHARSET utf8,
         `pDescription` VARCHAR(200) CHARSET utf8,
         `pControlType` VARCHAR(30) CHARSET utf8
-    )   RETURNS int(11)
+    ) RETURNS int(11)
     NO SQL
 BEGIN
     DECLARE vOrderNum, vIsLocked INT DEFAULT -1;
@@ -1968,8 +1965,11 @@ END //
 
 
 DROP FUNCTION IF EXISTS SwapSubmoduleOrder//
-CREATE FUNCTION `SwapSubmoduleOrder`
-(   `pTeacherID` INT, `pSubmoduleID1` INT, `pSubmoduleID2` INT  ) RETURNS int(11)
+CREATE FUNCTION `SwapSubmoduleOrder` (
+        `pTeacherID` INT,
+        `pSubmoduleID1` INT,
+        `pSubmoduleID2` INT
+    ) RETURNS int(11)
     NO SQL
 BEGIN
     DECLARE vDisciplineID, vOrder1, vOrder2,
@@ -2024,30 +2024,13 @@ END //
 # Label: rating
 # -------------------------------------------------------------------------------------------
 
-# TODO: kill
-DROP FUNCTION IF EXISTS GetMaxRateForDisc//
-CREATE FUNCTION `GetMaxRateForDisc`
-(   `pDisciplineID` INT  )   RETURNS int(11)
-    NO SQL
-BEGIN
-    DECLARE vResult INT DEFAULT 0;
-
-    SELECT SUM(submodules.MaxRate)
-        INTO vResult
-        FROM `modules`
-        LEFT JOIN `submodules` ON   submodules.ModuleID = modules.ID
-        WHERE   modules.DisciplineID = pDisciplineID AND
-                submodules.IsUsed != 0 AND
-                (modules.Type = 1 OR ( modules.Type = 2 AND submodules.OrderNum = 1))
-        LIMIT 1;
-    RETURN  (vResult);
-END //
-
 
 # Вычисление максимального балла для submodule
 DROP FUNCTION IF EXISTS CalculateMaxRateForExtra//
-CREATE FUNCTION `CalculateMaxRateForExtra`
-( `pSubmoduleID` INT, `pStudentID` INT) RETURNS int(11)
+CREATE FUNCTION `CalculateMaxRateForExtra` (
+        `pSubmoduleID` INT,
+        `pStudentID` INT
+    ) RETURNS int(11)
     NO SQL
 BEGIN
     DECLARE vExamType INT DEFAULT -1; # enum('exam', 'credit');# utf8;
@@ -2081,26 +2064,27 @@ END //
 
 
 DROP FUNCTION IF EXISTS SetStudentRate//
-CREATE FUNCTION `SetStudentRate`
-    (   `pTeacherID` INT,
+CREATE FUNCTION `SetStudentRate` (
+        `pTeacherID` INT,
         `pStudentID` INT,
         `pSubmoduleID` INT,
         `pRate` INT
     ) RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vDisciplineID, vMaxRate, vModuleType INT DEFAULT -1;
+    DECLARE vDisciplineID, vMaxRate, vModuleType, vSemesterID INT DEFAULT -1;
     DECLARE vIsOver, vIsLocked, vIsUsed BOOLEAN DEFAULT FALSE;
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
     SET vIsOver = TRUE;
     SELECT  disciplines.ID,
+            disciplines.SemesterID,
             disciplines.IsLocked,
             disciplines.Milestone,
             submodules.IsUsed,
             submodules.maxRate,
             modules.Type
-        INTO vDisciplineID, vIsLocked, vIsOver, vIsUsed, vMaxRate, vModuleType
+        INTO vDisciplineID, vSemesterID, vIsLocked, vIsOver, vIsUsed, vMaxRate, vModuleType
         FROM `submodules`
         INNER JOIN `modules`                ON  submodules.ModuleID = modules.ID
         INNER JOIN `disciplines`            ON  modules.DisciplineID = disciplines.ID
@@ -2115,8 +2099,8 @@ BEGIN
     # 1) check rights
     # 2) check, you can't rate regular and bonus after milestone
     # 3) check, max rate exceeding
-    IF  NOT InternalIsStudentAttached(pStudentID, vDisciplineID) OR
-        NOT InternalIsTeacherBounded(pTeacherID, vDisciplineID) OR
+    IF  NOT InternalIsStudentAttached(pStudentID, vDisciplineID, vSemesterID) OR
+        NOT InternalIsTeacherBound(pTeacherID, vDisciplineID) OR
         pRate > vMaxRate OR
         (vIsOver AND (vModuleType = 1 OR vModuleType = 3)) # 1 - regular, 3 - bonus
     THEN
@@ -2168,8 +2152,9 @@ END //
 
 
 DROP FUNCTION IF EXISTS SetRequestStatus//
-CREATE FUNCTION `SetRequestStatus`
-    (`pRequestID` INT, `pStatus` VARCHAR(20) CHARSET utf8
+CREATE FUNCTION `SetRequestStatus` (
+        `pRequestID` INT,
+        `pStatus` VARCHAR(20) CHARSET utf8
     ) RETURNS int(11)
     NO SQL
 BEGIN
@@ -2207,20 +2192,21 @@ END//
 
 
 DROP FUNCTION IF EXISTS CreateRecoveryToken//
-CREATE FUNCTION `CreateRecoveryToken`
-    (   `pAccountOrEMail` VARCHAR(255) CHARSET utf8,
+CREATE FUNCTION `CreateRecoveryToken` (
+        `pAccountOrEMail` VARCHAR(255) CHARSET utf8,
         `pToken` VARCHAR(100) CHARSET utf8
-    )	RETURNS VARCHAR(255) charset utf8
+    ) RETURNS VARCHAR(255) charset utf8
     NO SQL
 BEGIN
     DECLARE vAccountID INT DEFAULT -1;
-    DECLARE vUserFullName TEXT;
-    DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
+    DECLARE vUserFullName TEXT charset utf8;
+    DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -2;
 
     # get account ID
     SELECT accounts.ID INTO vAccountID
         FROM `accounts`
-        WHERE accounts.EMail = pAccountOrEMail
+        WHERE accounts.EMail = pAccountOrEMail OR
+              accounts.Login = pAccountOrEMail
         LIMIT 1;
     IF vAccountID <= 0 THEN
         RETURN '';
@@ -2234,47 +2220,51 @@ BEGIN
     # transform all unused recovery tokens into used
     UPDATE `recovery_tokens`
     SET recovery_tokens.isUsed = 1
-    WHERE recovery_tokens.isUsed = 0;
+    WHERE   recovery_tokens.isUsed = 0 AND
+            recovery_tokens.AccountID = vAccountID;
 
     # handle catch constraints violations
     INSERT INTO `recovery_tokens`
-        (AccountID, Token )
-    VALUES  (vAccountID, Token);
+        ( AccountID, Token )
+        VALUES  (vAccountID, pToken);
     RETURN vUserFullName;
 END//
 
 DROP FUNCTION IF EXISTS GetUserFullNameByAccountID//
-CREATE FUNCTION `GetUserFullNameByAccountID`
-    (   `pAccountID` INT(11))   RETURNS VARCHAR(255) charset utf8
+CREATE FUNCTION `GetUserFullNameByAccountID` (
+        `pAccountID` INT(11)
+    ) RETURNS VARCHAR(255) charset utf8
 NO SQL
 BEGIN
-    DECLARE vUserFullName VARCHAR(255);
+    DECLARE vUserFullName VARCHAR(255) charset utf8;
     DECLARE vChecker INT DEFAULT -1;
 
-    SELECT students.ID As ID, CONCAT(students.LastName,' ',students.FirstName,' ',students.SecondName) As UserName
-    INTO vChecker, vUserFullName
-    FROM `students`
-    WHERE students.AccountID = pAccountID
-    LIMIT 1;
-
-    IF vChecker <= 0 THEN
-    SELECT teachers.ID As ID, CONCAT(teachers.LastName,' ',teachers.FirstName,' ',teachers.SecondName) As UserName
-    INTO vChecker, vUserFullName
-    FROM `teachers`
-    WHERE teachers.AccountID = pAccountID
-    LIMIT 1;
-
-    IF vChecker <= 0 THEN
-      RETURN '';
-    END IF;
+    # try to find student with that account id
+    SELECT students.ID, CONCAT(students.LastName,' ',students.FirstName,' ',students.SecondName)
+        INTO vChecker, vUserFullName
+        FROM `students`
+        WHERE students.AccountID = pAccountID
+        LIMIT 1;
+
+    IF vChecker <= 0 THEN # try to find teacher with that account id
+        SELECT teachers.ID, CONCAT(teachers.LastName,' ',teachers.FirstName,' ',teachers.SecondName)
+            INTO vChecker, vUserFullName
+            FROM `teachers`
+            WHERE teachers.AccountID = pAccountID
+            LIMIT 1;
+
+        IF vChecker <= 0 THEN
+          RETURN '';
+        END IF;
     END IF;
 
     RETURN vUserFullName;
 END//
 
 DROP FUNCTION IF EXISTS UseRecoveryToken//
-CREATE FUNCTION `UseRecoveryToken`
-(   `pToken` VARCHAR(100) CHARSET utf8) RETURNS int(11)
+CREATE FUNCTION `UseRecoveryToken` (
+        `pToken` VARCHAR(100) CHARSET utf8
+    ) RETURNS int(11)
     NO SQL
 BEGIN
     DECLARE vChecker INT DEFAULT -1;
@@ -2288,7 +2278,11 @@ BEGIN
 END//
 
 DROP FUNCTION IF EXISTS SaveSession //
-CREATE FUNCTION SaveSession(pSessionID VARCHAR(40), pUserLogin VARCHAR(50) CHARSET utf8, pUserPassword VARCHAR(64)) RETURNS INT(11)
+CREATE FUNCTION SaveSession
+    (   pSessionID VARCHAR(40),
+        pUserLogin VARCHAR(50) CHARSET utf8,
+        pUserPassword VARCHAR(64)
+    ) RETURNS INT(11)
     NO SQL
 BEGIN
     INSERT INTO sessions (SessionID, Login, Password)
diff --git a/db/StoredProcedures.sql b/db/StoredProcedures.sql
index 90b19257eba5f5b8706fc4d244fa832dbd1298dc..765c506743aa67461c914f194058b9a7c1240b84 100644
--- a/db/StoredProcedures.sql
+++ b/db/StoredProcedures.sql
@@ -18,6 +18,8 @@ DROP PROCEDURE IF EXISTS GetMapForStudentExam//
 DROP PROCEDURE IF EXISTS GetRatesForStudentsGroup//
 
 DROP PROCEDURE IF EXISTS CreateFaculty //
+DROP PROCEDURE IF EXISTS GetReports//
+DROP PROCEDURE IF EXISTS GetSettings//
 
 
 # -------------------------------------------------------------------------------------------
@@ -35,15 +37,8 @@ DROP PROCEDURE IF EXISTS CreateFaculty //
 # Label: magic
 # -------------------------------------------------------------------------------------------
 
-DROP PROCEDURE IF EXISTS GetSettings//
-CREATE PROCEDURE `GetSettings`(IN `pKey` VARCHAR(50) CHARSET utf8)
-    NO SQL
-BEGIN
-    SELECT general_settings.*
-        FROM `general_settings`
-        WHERE general_settings.Name = pKey
-        LIMIT 1;
-END //
+
+
 
 
 # -------------------------------------------------------------------------------------------
@@ -51,10 +46,12 @@ END //
 # -------------------------------------------------------------------------------------------
 
 DROP PROCEDURE IF EXISTS GetSemesterInfo//
-CREATE PROCEDURE `GetSemesterInfo` (IN `pSemesterID` INT)
-    NO SQL
+CREATE PROCEDURE `GetSemesterInfo` (
+    IN `pSemesterID` INT
+) NO SQL
 BEGIN
-    SELECT  semesters.Num   As 'Num',
+    SELECT  semesters.ID    AS 'ID',
+            semesters.Num   As 'Num',
             semesters.Year  As 'Year'
         FROM `semesters`
         WHERE semesters.ID = pSemesterID
@@ -62,8 +59,8 @@ BEGIN
 END //
 
 DROP PROCEDURE IF EXISTS GetSemesters//
-CREATE PROCEDURE `GetSemesters`  ()
-    NO SQL
+CREATE PROCEDURE `GetSemesters` (
+) NO SQL
 BEGIN
     SELECT  semesters.ID,
             semesters.Year,
@@ -79,8 +76,8 @@ END //
 # -------------------------------------------------------------------------------------------
 
 DROP PROCEDURE IF EXISTS GetFaculties//
-CREATE PROCEDURE `GetFaculties` ( )
-    NO SQL
+CREATE PROCEDURE `GetFaculties` (
+) NO SQL
 BEGIN
     SELECT  faculties.ID,
             faculties.Name,
@@ -94,8 +91,9 @@ END //
 # -------------------------------------------------------------------------------------------
 
 DROP PROCEDURE IF EXISTS GetDepartments//
-CREATE PROCEDURE `GetDepartments` (IN `pFacultyID` INT)
-    NO SQL
+CREATE PROCEDURE `GetDepartments` (
+    IN `pFacultyID` INT
+) NO SQL
 BEGIN
     SELECT  departments.ID,
             departments.Name
@@ -110,8 +108,9 @@ END //
 # -------------------------------------------------------------------------------------------
 
 DROP PROCEDURE IF EXISTS GetSpecializations//
-CREATE PROCEDURE `GetSpecializations` (IN `pFacultyID` INT)
-    NO SQL
+CREATE PROCEDURE `GetSpecializations` (
+    IN `pFacultyID` INT
+) NO SQL
 BEGIN
     SELECT  specializations.ID,
             specializations.Name,
@@ -127,8 +126,8 @@ END //
 # -------------------------------------------------------------------------------------------
 
 DROP PROCEDURE IF EXISTS GetJobPositions//
-CREATE PROCEDURE `GetJobPositions` ( )
-    NO SQL
+CREATE PROCEDURE `GetJobPositions` (
+) NO SQL
 BEGIN
     SELECT  job_positions.ID,
             job_positions.Name
@@ -142,13 +141,13 @@ END //
 # -------------------------------------------------------------------------------------------
 
 DROP PROCEDURE IF EXISTS GetGrades//
-CREATE PROCEDURE `GetGrades` ( )
-    NO SQL
+CREATE PROCEDURE `GetGrades` (
+) NO SQL
 BEGIN
-    SELECT  grades.ID       AS 'ID',
-            grades.Num      AS 'Num',
-            grades.Degree   AS 'Degree'
-        FROM    `grades`
+    SELECT  grades.ID,
+            grades.Num,
+            grades.Degree
+        FROM `grades`
         ORDER BY grades.ID;
 END //
 
@@ -158,9 +157,10 @@ END //
 # -------------------------------------------------------------------------------------------
 
 DROP PROCEDURE IF EXISTS GetGroups//
-CREATE PROCEDURE `GetGroups`
-    (IN `pGradeID` INT, IN `pFacultyID` INT)
-    NO SQL
+CREATE PROCEDURE `GetGroups` (
+    IN `pGradeID` INT,
+    IN `pFacultyID` INT
+) NO SQL
 BEGIN
     SELECT  view_groups.GroupID AS 'ID',
             view_groups.GroupNum,
@@ -176,8 +176,9 @@ END //
 
 # get all general study groups, that takes this course
 DROP PROCEDURE IF EXISTS GetGroupsForDiscipline//
-CREATE PROCEDURE `GetGroupsForDiscipline` (IN `pDisciplineID` INT)
-    NO SQL
+CREATE PROCEDURE `GetGroupsForDiscipline` (
+    IN `pDisciplineID` INT
+) NO SQL
 BEGIN
     SELECT  view_groups.GroupID AS 'ID',
             view_groups.GroupNum,
@@ -200,15 +201,16 @@ END //
 # -------------------------------------------------------------------------------------------
 
 DROP PROCEDURE IF EXISTS GetSubjects//
-CREATE PROCEDURE `GetSubjects` (IN `pFacultyID` INT)
-    NO SQL
+CREATE PROCEDURE `GetSubjects` (
+    IN `pFacultyID` INT
+) NO SQL
 BEGIN
     SELECT  subjects.ID,
-            subjects.Name,
+            subjects.Name AS 'Title',
             subjects.Abbr
         FROM `subjects_faculties`
         INNER JOIN `subjects` ON subjects_faculties.SubjectID = subjects.ID
-        WHERE   subjects_faculties.FacultyID = pFacultyID
+        WHERE subjects_faculties.FacultyID = pFacultyID
         ORDER BY subjects.Name ASC;
 END //
 
@@ -218,6 +220,7 @@ END //
 # Label: accounts
 # -------------------------------------------------------------------------------------------
 
+# TODO: deprecated (see GetFullInfo)
 DROP PROCEDURE IF EXISTS GetAccountInfo//
 CREATE PROCEDURE `GetAccountInfo` ( IN `pUserID` INT )
     NO SQL
@@ -237,10 +240,12 @@ BEGIN
         LIMIT 1;
 END //
 
-
+# TODO: deprecated (see GetFullInfo)
 DROP PROCEDURE IF EXISTS GetPersonalInfo//
-CREATE PROCEDURE `GetPersonalInfo` ( IN `pUserID` INT )
-    NO SQL
+CREATE PROCEDURE `GetPersonalInfo` (
+    IN `pUserID` INT,
+    IN `pSemesterID` INT
+) NO SQL
 BEGIN
     DECLARE vAccountType INT DEFAULT -1;
     SELECT user_roles.Type INTO vAccountType
@@ -270,7 +275,7 @@ BEGIN
                 view_students.FacultyAbbr
             FROM `view_students`
             WHERE view_students.AccountID = pUserID AND
-                  view_students.SemesterID = @CurrentSemesterID
+                  view_students.SemesterID = pSemesterID
             LIMIT 1;
     ELSE
         SELECT  view_teachers.LastName,
@@ -289,6 +294,86 @@ BEGIN
     END IF;
 END //
 
+DROP PROCEDURE IF EXISTS GetFullInfo//
+CREATE PROCEDURE `GetFullInfo` (
+    IN `pUserID` INT,
+    IN `pSemesterID` INT
+) NO SQL
+BEGIN
+    DECLARE vAccountType enum('student', 'teacher');
+
+    SELECT user_roles.Type INTO vAccountType
+        FROM `accounts`
+        INNER JOIN `user_roles` ON accounts.UserRoleID = user_roles.ID
+        WHERE accounts.ID = pUserID
+        LIMIT 1;
+
+# type 1: student
+#      2: teacher
+    IF vAccountType = 'student' THEN
+
+        SELECT  # student info
+                view_students.LastName,
+                view_students.FirstName,
+                view_students.SecondName,
+                view_students.StudentID,
+                view_students.GradeID,
+                view_students.GradeNum,
+                view_students.GroupID,
+                view_students.GroupNum,
+                view_students.GroupName,
+                view_students.Degree,
+                view_students.SpecID,
+                view_students.SpecName,
+                view_students.SpecAbbr,
+                view_students.FacultyID,
+                view_students.FacultyName,
+                view_students.FacultyAbbr,
+                # account info
+                accounts.ID,
+                accounts.Login,
+                accounts.EMail,
+                user_roles.Type,
+                user_roles.RoleName AS 'Role',
+                user_roles.Mark     AS 'RoleMark',
+                accounts.IsEnabled,
+                accounts.ActivationCode AS 'Code',
+                accounts.UserAgent
+            FROM `view_students`
+            INNER JOIN `accounts` ON accounts.ID = view_students.AccountID
+            INNER JOIN `user_roles` ON user_roles.ID = accounts.UserRoleID
+            WHERE view_students.AccountID = pUserID AND
+                  view_students.SemesterID = pSemesterID
+            LIMIT 1;
+    ELSE
+        SELECT  # teacher info
+                view_teachers.LastName,
+                view_teachers.FirstName,
+                view_teachers.SecondName,
+                view_teachers.TeacherID,
+                view_teachers.DepID,
+                view_teachers.DepName,
+                view_teachers.JobPositionName,
+                view_teachers.FacultyID,
+                view_teachers.FacultyName,
+                view_teachers.FacultyAbbr,
+                # account info
+                accounts.ID,
+                accounts.Login,
+                accounts.EMail,
+                user_roles.Type,
+                user_roles.RoleName AS 'Role',
+                user_roles.Mark     AS 'RoleMark',
+                accounts.IsEnabled,
+                accounts.ActivationCode AS 'Code',
+                accounts.UserAgent
+            FROM `view_teachers`
+            INNER JOIN `accounts` ON accounts.ID = view_teachers.AccountID
+            INNER JOIN `user_roles` ON user_roles.ID = accounts.UserRoleID
+            WHERE view_teachers.AccountID = pUserID
+            LIMIT 1;
+    END IF;
+END //
 
 
 
@@ -296,6 +381,7 @@ END //
 # Label: teachers
 # -------------------------------------------------------------------------------------------
 
+# TODO: used in php
 DROP PROCEDURE IF EXISTS GetTeachersByFaculty//
 # CREATE PROCEDURE `GetTeachersByFaculty` (IN `pFacultyID` INT)
 #     NO SQL
@@ -338,40 +424,101 @@ DROP PROCEDURE IF EXISTS GetTeachersForDiscipline//
 CREATE PROCEDURE `GetTeachersForDiscipline`(IN `pDisciplineID` INT)
     NO SQL
 BEGIN
-    SELECT  view_disciplines_teachers.TeacherID AS 'ID',
-            view_disciplines_teachers.LastName,
-            view_disciplines_teachers.FirstName,
-            view_disciplines_teachers.SecondName,
-            view_disciplines_teachers.JobPositionID,
-            view_disciplines_teachers.JobPositionName,
-            view_disciplines_teachers.DepID,
-            view_disciplines_teachers.DepName,
-            view_disciplines_teachers.FacultyID,
-            view_disciplines_teachers.FacultyAbbr,
-            view_disciplines_teachers.IsAuthor
-        FROM `view_disciplines_teachers`
-        WHERE view_disciplines_teachers.DisciplineID = pDisciplineID
-        ORDER BY view_disciplines_teachers.IsAuthor DESC,
-                view_disciplines_teachers.LastName ASC,
-                view_disciplines_teachers.FirstName ASC;
+    DECLARE vAuthorID INT DEFAULT -1;
+    SET vAuthorID = GetDisciplineProperty(pDisciplineID, 'author');
+
+    SELECT  view_teachers.TeacherID AS 'ID',
+            view_teachers.LastName,
+            view_teachers.FirstName,
+            view_teachers.SecondName,
+            view_teachers.JobPositionID,
+            view_teachers.JobPositionName,
+            view_teachers.DepID,
+            view_teachers.DepName,
+            view_teachers.FacultyID,
+            view_teachers.FacultyAbbr,
+            ( view_teachers.TeacherID = vAuthorID ) AS 'IsAuthor'
+        FROM `disciplines_teachers`
+        INNER JOIN `view_teachers` ON view_teachers.TeacherID = disciplines_teachers.TeacherID
+        WHERE disciplines_teachers.DisciplineID = pDisciplineID
+        ORDER BY    view_teachers.TeacherID = vAuthorID DESC,
+                    view_teachers.LastName ASC,
+                    view_teachers.FirstName ASC;
+END //
+
+DROP PROCEDURE IF EXISTS GetTeachersListForStudent//
+CREATE PROCEDURE `GetTeachersListForStudent` (
+    IN `pStudentID` INT,
+    IN `pSemesterID` INT
+) NO SQL
+BEGIN
+    DECLARE vStudentGroup INT DEFAULT -1;
+    SET vStudentGroup = GetStudentGroup(pStudentID, pSemesterID);
+
+# select all disciplines for user
+    CREATE TEMPORARY TABLE IF NOT EXISTS tDisciplines AS (
+        SELECT disc2.DisciplineID
+        FROM (
+             SELECT  disc1.DisciplineID,
+                     COALESCE(disc1.Type) AS 'Type'
+                 FROM (
+                          SELECT  disciplines_students.DisciplineID,
+                              disciplines_students.Type
+                          FROM `disciplines_students`
+                          WHERE   disciplines_students.StudentID = pStudentID
+                          UNION
+                          SELECT  disciplines_groups.DisciplineID,
+                              NULL AS 'Type'
+                          FROM `disciplines_groups`
+                          WHERE   disciplines_groups.GroupID = vStudentGroup
+                      ) AS disc1
+                     INNER JOIN `disciplines` ON disciplines.ID = disc1.DisciplineID
+                 WHERE disciplines.SemesterID = pSemesterID
+                 GROUP BY disc1.DisciplineID
+             ) AS disc2
+        WHERE NOT disc2.Type <=> 'detach'
+    );
+
+
+    SELECT  tDisciplines.DisciplineID,
+            GROUP_CONCAT(
+                CONCAT(teachers.LastName, ' ', teachers.FirstName, ' ', teachers.SecondName)
+                ORDER BY    teachers.ID = disciplines.AuthorID DESC,
+                teachers.LastName ASC,
+                teachers.FirstName ASC
+                SEPARATOR ';'
+            ) AS 'FullNameList'
+    FROM tDisciplines
+        INNER JOIN `disciplines` ON disciplines.ID = tDisciplines.DisciplineID
+        LEFT JOIN `disciplines_teachers` ON disciplines_teachers.DisciplineID = tDisciplines.DisciplineID
+        INNER JOIN `teachers` ON teachers.ID = disciplines_teachers.TeacherID
+    GROUP BY tDisciplines.DisciplineID
+    ORDER BY tDisciplines.DisciplineID;
 END //
 
 
 
 # get teachers, that don't teach course
 DROP PROCEDURE IF EXISTS SearchTeachers//
-CREATE PROCEDURE `SearchTeachers`
-    (   IN `pFacultyID` INT, IN `pDepartmentID` INT,
-        IN `pFullName` VARCHAR(100) CHARSET utf8,
-        # order: LastName + FirstName + SecondName
-        IN `pDisciplineID` INT  )
-    NO SQL
+CREATE PROCEDURE `SearchTeachers` (
+    IN `pFacultyID` INT,
+    IN `pDepartmentID` INT,
+    IN `pFullName` VARCHAR(100) CHARSET utf8,
+    # order: LastName + FirstName + SecondName
+    IN `pDisciplineID` INT
+) NO SQL
 BEGIN
     DECLARE vAuthorID INT DEFAULT -1;
-    SELECT disciplines.AuthorID INTO vAuthorID
-        FROM `disciplines`
-        WHERE disciplines.ID = pDisciplineID
-        LIMIT 1;
+    DECLARE vFullNameReg VARCHAR(102) CHARSET utf8;
+    SET vAuthorID = GetDisciplineProperty(pDisciplineID, 'author');
+    SET vFullNameReg = CONCAT('%', pFullName, '%');
+
+
+    CREATE TEMPORARY TABLE IF NOT EXISTS tDiscTeachers AS (
+        SELECT disciplines_teachers.TeacherID
+            FROM disciplines_teachers
+            WHERE disciplines_teachers.DisciplineID = pDisciplineID
+    );
 
     SELECT  view_teachers.TeacherID AS 'ID',
             view_teachers.LastName,
@@ -380,14 +527,26 @@ BEGIN
             view_teachers.JobPositionName,
             view_teachers.DepID,
             view_teachers.DepName,
-            (view_teachers.TeacherID = vAuthorID) AS 'IsAuthor'
+            ( view_teachers.TeacherID = vAuthorID ) AS 'IsAuthor'
         FROM `view_teachers`
-        WHERE NOT InternalIsTeacherBounded(view_teachers.TeacherID, pDisciplineID) AND
-            view_teachers.FacultyID = pFacultyID AND
-            CONCAT( view_teachers.LastName, view_teachers.FirstName, view_teachers.SecondName)
-                LIKE CONCAT('%', pFullName, '%')
-        ORDER BY view_teachers.FacultyID ASC,view_teachers.DepName ASC,
-                view_teachers.LastName ASC, view_teachers.FirstName ASC;
+        WHERE   view_teachers.FacultyID = pFacultyID AND
+                CASE WHEN pDepartmentID != 0 THEN view_teachers.DepID = pDepartmentID ELSE TRUE END AND
+                NOT EXISTS (
+                    SELECT * FROM tDiscTeachers
+                    WHERE tDiscTeachers.TeacherID = view_teachers.TeacherID
+                    LIMIT 1
+                ) AND
+                CASE
+                    WHEN pFullName != '' THEN
+                        CONCAT( view_teachers.LastName, ' ', view_teachers.FirstName, ' ', view_teachers.SecondName)
+                            LIKE vFullNameReg
+                    ELSE
+                        TRUE
+                END
+        ORDER BY    view_teachers.FacultyID ASC,
+                    view_teachers.DepName ASC,
+                    view_teachers.LastName ASC,
+                    view_teachers.FirstName ASC;
 END //
 
 
@@ -397,8 +556,10 @@ END //
 
 DROP PROCEDURE IF EXISTS GetStudentsByStudyGroups//
 DROP PROCEDURE IF EXISTS GetStudents//
-CREATE PROCEDURE `GetStudents`  (IN `pGroupID` INT)
-    NO SQL
+CREATE PROCEDURE `GetStudents`  (
+    IN `pGroupID` INT,
+    IN `pSemesterID` INT
+) NO SQL
 BEGIN
     SELECT  view_students.StudentID AS 'ID',
             view_students.LastName,
@@ -412,16 +573,45 @@ BEGIN
             view_students.GroupNum
         FROM `view_students`
         WHERE view_students.GroupID = pGroupID AND
-              view_students.SemesterID = @CurrentSemesterID
+              view_students.SemesterID = pSemesterID
         ORDER BY view_students.LastName ASC, view_students.FirstName ASC;
 END //
 
 
 DROP PROCEDURE IF EXISTS GetStudentsByFaculty//
-CREATE PROCEDURE `GetStudentsByFaculty`
-    (   IN `pFacultyID` INT,
+CREATE PROCEDURE `GetStudentsByFaculty` (
+    IN `pFacultyID` INT,
+    IN `pGradeID` INT,
+    IN `pGroupID` INT,
+    IN `pSemesterID` INT
+) NO SQL
+BEGIN
+    SELECT  view_students.StudentID AS 'ID',
+            view_students.LastName,
+            view_students.FirstName,
+            view_students.SecondName,
+            view_students.AccountID,
+            view_students.GradeID,
+            view_students.GradeNum,
+            view_students.Degree,
+            view_students.GroupID,
+            view_students.GroupNum
+    FROM `view_students`
+    WHERE   view_students.FacultyID = pFacultyID AND
+            view_students.SemesterID = pSemesterID AND
+            CASE WHEN pGradeID != 0 THEN view_students.GradeID = pGradeID ELSE TRUE END AND
+            CASE WHEN pGroupID != 0 THEN view_students.GroupID = pGroupID ELSE TRUE END
+    ORDER BY view_students.LastName ASC, view_students.FirstName ASC;
+END //
+
+
+DROP PROCEDURE IF EXISTS SearchStudentsByName//
+CREATE PROCEDURE `SearchStudentsByName`(
+        IN `pFullName` VARCHAR(100) CHARSET utf8,
+        IN `pFacultyID` INT,
         IN `pGradeID` INT,
-        IN `pGroupID` INT
+        IN `pGroupID` INT,
+        IN `pSemesterID` INT
     )
     NO SQL
 BEGIN
@@ -436,22 +626,52 @@ BEGIN
             view_students.GroupID,
             view_students.GroupNum
     FROM `view_students`
-    WHERE view_students.FacultyID = pFacultyID AND
-          view_students.SemesterID = @CurrentSemesterID AND
+    WHERE view_students.SemesterID = pSemesterID AND
+          (pFacultyID = 0 OR view_students.FacultyID = pFacultyID) AND
           (pGradeID = 0 OR view_students.GradeID = pGradeID) AND
-          (pGroupID = 0 OR view_students.GroupID = pGroupID)
+          (pGroupID = 0 OR view_students.GroupID = pGroupID) AND
+          CONCAT(view_students.LastName, ' ', view_students.FirstName, ' ', view_students.SecondName)
+              LIKE CONCAT('%', pFullName, '%')
+
+
     ORDER BY view_students.LastName ASC, view_students.FirstName ASC;
 END //
 
 
-# students, that don't included in general groups without attached
+# not in general groups, not attached
 DROP PROCEDURE IF EXISTS SearchStudents//
-CREATE PROCEDURE `SearchStudents`
-    (   IN `pGradeID` INT, IN `pGroupID` INT, IN `pFacultyID` INT,
-        IN `pFullName` VARCHAR(100) CHARSET utf8,
-        IN `pDisciplineID` INT)
-    NO SQL
+CREATE PROCEDURE `SearchStudents` (
+    IN `pGradeID` INT,
+    IN `pGroupID` INT,
+    IN `pFacultyID` INT,
+    IN `pFullName` VARCHAR(100) CHARSET utf8,
+    IN `pDisciplineID` INT
+) NO SQL
 BEGIN
+    DECLARE vSemesterID INT DEFAULT -1;
+    DECLARE vFullNameReg VARCHAR(102) CHARSET utf8;
+    DECLARE vIsGroupAttached BOOLEAN DEFAULT FALSE;
+    SET vSemesterID = GetDisciplineProperty(pDisciplineID, 'semester');
+    SET vFullNameReg = CONCAT('%', pFullName, '%');
+
+    CREATE TEMPORARY TABLE IF NOT EXISTS tDiscGroups AS (
+        SELECT disciplines_groups.GroupID
+        FROM `disciplines_groups`
+        WHERE disciplines_groups.DisciplineID = pDisciplineID
+    );
+    CREATE TEMPORARY TABLE IF NOT EXISTS tAttStud AS (
+        SELECT disciplines_students.StudentID
+        FROM `disciplines_students`
+        WHERE   disciplines_students.DisciplineID = pDisciplineID AND
+                disciplines_students.Type = 'attach'
+    );
+
+    IF pGroupID != 0 THEN
+        SET vIsGroupAttached = EXISTS(
+            SELECT * FROM tDiscGroups WHERE tDiscGroups.GroupID = pGroupID LIMIT 1
+        );
+    END IF;
+
     SELECT  view_students.StudentID AS 'ID',
             view_students.LastName,
             view_students.FirstName,
@@ -462,78 +682,125 @@ BEGIN
             view_students.GroupID,
             view_students.GroupNum
         FROM `view_students`
-        LEFT JOIN `disciplines_students` ON disciplines_students.StudentID = view_students.StudentID AND
-                                            disciplines_students.DisciplineID = pDisciplineID
-        LEFT JOIN `disciplines_groups` ON   disciplines_groups.GroupID = view_students.GroupID AND
-                                            disciplines_groups.DisciplineID = pDisciplineID
-        WHERE   view_students.SemesterID = @CurrentSemesterID AND
+        WHERE   view_students.SemesterID = vSemesterID AND
                 view_students.FacultyID = pFacultyID AND
                 view_students.GradeID = pGradeID AND
-                (view_students.GroupID = pGroupID OR pGroupID = 0) AND
-                CONCAT(view_students.LastName, view_students.FirstName, view_students.SecondName)
-                    LIKE CONCAT('%', pFullName, '%') AND
-                disciplines_groups.ID IS NULL AND
-                (disciplines_students.Type IS NULL OR disciplines_students.Type != 'attach')
+
+                CASE
+                    WHEN pGroupID != 0 THEN
+                        NOT vIsGroupAttached AND
+                        view_students.GroupID = pGroupID
+                    ELSE
+                        NOT EXISTS( SELECT * FROM tDiscGroups WHERE tDiscGroups.GroupID = view_students.GroupID )
+                END AND
+
+                NOT EXISTS( SELECT * FROM tAttStud WHERE tAttStud.StudentID = view_students.StudentID LIMIT 1 ) AND
+
+                CASE
+                    WHEN pFullName != '' THEN
+                        CONCAT(view_students.LastName, ' ', view_students.FirstName, ' ', view_students.SecondName) LIKE vFullNameReg
+                    ELSE
+                        TRUE
+                END
         ORDER BY    view_students.GradeID ASC,
                     view_students.GroupID ASC;
 END //
 
 
 
-# all students in general groups, that take course (with attached and detached)
+# in general groups, attached or detached
 DROP PROCEDURE IF EXISTS GetStudentsForDiscipline//
-CREATE PROCEDURE `GetStudentsForDiscipline`
-    (   IN `pDisciplineID` INT)
-    NO SQL
+CREATE PROCEDURE `GetStudentsForDiscipline` (
+    IN `pDisciplineID` INT
+) NO SQL
 BEGIN
-    SELECT  view_disciplines_students.StudentID AS 'ID',
-            view_disciplines_students.LastName,
-            view_disciplines_students.FirstName,
-            view_disciplines_students.SecondName,
-            view_disciplines_students.GradeID,
-            view_disciplines_students.GradeNum,
-            view_disciplines_students.Degree,
-            view_disciplines_students.GroupID,
-            view_disciplines_students.GroupNum,
-            view_disciplines_students.AttachType AS 'AttachType'
-    FROM `view_disciplines_students`
-    WHERE view_disciplines_students.DisciplineID = pDisciplineID AND
-          view_disciplines_students.SemesterID = @CurrentSemesterID
-    ORDER BY    (view_disciplines_students.AttachType IS NULL OR
-                    view_disciplines_students.AttachType = 'detach') DESC,
-        view_disciplines_students.GradeID ASC,
-        view_disciplines_students.GroupNum ASC,
-        view_disciplines_students.LastName ASC,
-        view_disciplines_students.FirstName ASC;
+    DECLARE vSemesterID INT DEFAULT -1;
+    SET vSemesterID = GetDisciplineProperty(pDisciplineID, 'semester');
+
+    SELECT  view_students.StudentID AS 'ID',
+            view_students.LastName,
+            view_students.FirstName,
+            view_students.SecondName,
+            view_students.GradeID,
+            view_students.GradeNum,
+            view_students.Degree,
+            view_students.GroupID,
+            view_students.GroupNum,
+            tDiscStudents.Type AS 'AttachType'
+        FROM (
+                SELECT  st.StudentID,
+                        COALESCE(st.Type) AS 'Type'
+                FROM (
+                    SELECT  disciplines_students.StudentID,
+                            disciplines_students.Type
+                        FROM `disciplines_students`
+                        WHERE disciplines_students.DisciplineID = pDisciplineID
+                    UNION
+                    SELECT  students_groups.StudentID,
+                            NULL AS 'Type'
+                        FROM `disciplines_groups`
+                        LEFT JOIN `students_groups` ON students_groups.SemesterID = vSemesterID AND
+                                                       students_groups.GroupID = disciplines_groups.GroupID
+                        WHERE disciplines_groups.DisciplineID = pDisciplineID
+                ) as st
+                GROUP BY st.StudentID
+        ) tDiscStudents
+        INNER JOIN `view_students` ON   view_students.StudentID = tDiscStudents.StudentID AND
+                                        view_students.SemesterID = vSemesterID
+        ORDER BY    ( tDiscStudents.Type <=> 'attach' ) ASC,
+                    view_students.GradeID ASC,
+                    view_students.GroupNum ASC,
+                    view_students.LastName ASC,
+                    view_students.FirstName ASC;
 END //
 
 
 
-# all students takes that course (general groups + attached)
+# in general groups + attached
 DROP PROCEDURE IF EXISTS GetStudentsForRating//
-CREATE PROCEDURE `GetStudentsForRating`
-    (   IN `pDisciplineID` INT)
-    NO SQL
+CREATE PROCEDURE `GetStudentsForRating` (
+    IN `pDisciplineID` INT
+) NO SQL
 BEGIN
-    SELECT  view_disciplines_students.StudentID AS 'ID',
-            view_disciplines_students.LastName,
-            view_disciplines_students.FirstName,
-            view_disciplines_students.SecondName,
-            view_disciplines_students.GradeID,
-            view_disciplines_students.GradeNum,
-            view_disciplines_students.Degree,
-            view_disciplines_students.GroupID,
-            view_disciplines_students.GroupNum,
-            (view_disciplines_students.AttachType IS NOT NULL) AS 'IsAttached'
-    FROM `view_disciplines_students`
-    WHERE   view_disciplines_students.SemesterID = @CurrentSemesterID AND
-            view_disciplines_students.DisciplineID = pDisciplineID AND
-            (view_disciplines_students.AttachType IS NULL OR
-                view_disciplines_students.AttachType = 'attach')
-    ORDER BY    view_disciplines_students.GradeID ASC,
-        view_disciplines_students.GroupNum ASC,
-        view_disciplines_students.LastName ASC,
-        view_disciplines_students.FirstName ASC;
+    DECLARE vSemesterID INT DEFAULT -1;
+    SET vSemesterID = GetDisciplineProperty(pDisciplineID, 'semester');
+
+
+    SELECT  view_students.StudentID AS 'ID',
+            view_students.LastName,
+            view_students.FirstName,
+            view_students.SecondName,
+            view_students.GradeID,
+            view_students.GradeNum,
+            view_students.Degree,
+            view_students.GroupID,
+            view_students.GroupNum,
+            ( tDiscStudents.Type IS NOT NULL ) AS 'IsAttached'
+        FROM (
+                SELECT  st.StudentID,
+                        COALESCE(st.Type) AS 'Type'
+                FROM (
+                    SELECT  disciplines_students.StudentID,
+                            disciplines_students.Type
+                        FROM `disciplines_students`
+                        WHERE disciplines_students.DisciplineID = pDisciplineID
+                    UNION
+                        SELECT  students_groups.StudentID,
+                                NULL AS 'Type'
+                        FROM `disciplines_groups`
+                        LEFT JOIN `students_groups` ON  students_groups.SemesterID = vSemesterID AND
+                                                        students_groups.GroupID = disciplines_groups.GroupID
+                        WHERE disciplines_groups.DisciplineID = pDisciplineID
+                ) as st
+                GROUP BY st.StudentID
+        ) tDiscStudents
+        INNER JOIN `view_students` ON   view_students.StudentID = tDiscStudents.StudentID AND
+                                        view_students.SemesterID = vSemesterID
+        WHERE NOT tDiscStudents.Type <=> 'detach'
+        ORDER BY    view_students.GradeID ASC,
+                    view_students.GroupNum ASC,
+                    view_students.LastName ASC,
+                    view_students.FirstName ASC;
 END //
 
 
@@ -546,52 +813,65 @@ END //
 
 
 DROP PROCEDURE IF EXISTS GetDisciplineInfo//
-CREATE PROCEDURE `GetDisciplineInfo`
-    (   IN `pDisciplineID` INT)
-NO SQL
-    BEGIN
-        SELECT view_disciplines.DisciplineID,
-            view_disciplines.AuthorID,
-            view_disciplines.GradeID,
-            view_disciplines.GradeNum,
-            view_disciplines.Degree,
-            view_disciplines.ExamType,
-            view_disciplines.LectureCount,
-            view_disciplines.PracticeCount,
-            view_disciplines.LabCount,
-            view_disciplines.SemesterID,
-            view_disciplines.SubjectID,
-            view_disciplines.SubjectName,
-            view_disciplines.SubjectAbbr,
-            view_disciplines.FacultyID,
-            view_disciplines.FacultyName,
-            view_disciplines.IsLocked,
-            view_disciplines.Milestone,
-            view_disciplines.Subtype,
-            (modules.ID IS NOT NULL)    AS 'IsBonus'
-        FROM `view_disciplines`
-            LEFT JOIN  `modules` ON modules.DisciplineID = view_disciplines.DisciplineID AND
-                                    modules.Type = 'bonus'
-        WHERE view_disciplines.DisciplineID = pDisciplineID
-        LIMIT 1;
-    END //
+DROP PROCEDURE IF EXISTS Discipline_GetInfo//
+CREATE PROCEDURE `Discipline_GetInfo` (
+    IN `pDisciplineID` INT
+) NO SQL
+BEGIN
+    DECLARE vIsBonus BOOLEAN;
+    SET vIsBonus = EXISTS(
+        SELECT * FROM `modules`
+            WHERE   modules.DisciplineID = pDisciplineID AND
+                    modules.Type = 'bonus'
+            LIMIT 1
+    );
+
+    SELECT
+        view_disciplines.DisciplineID AS 'ID',
+        view_disciplines.AuthorID,
+        view_disciplines.GradeID,
+        view_disciplines.GradeNum,
+        view_disciplines.Degree,
+        view_disciplines.ExamType       AS 'Type',
+        view_disciplines.LectureCount   AS 'Lectures',
+        view_disciplines.PracticeCount  AS 'Practice',
+        view_disciplines.LabCount       AS 'Labs',
+        view_disciplines.SemesterID,
+        view_disciplines.SubjectID,
+        view_disciplines.SubjectName,
+        view_disciplines.SubjectAbbr,
+        view_disciplines.FacultyID,
+        view_disciplines.FacultyName,
+        view_disciplines.IsLocked,
+        view_disciplines.Milestone,
+        view_disciplines.Subtype,
+        vIsBonus AS 'IsBonus',
+        semesters.Num AS 'semesterNum', # TODO: Camelize
+        semesters.Year AS 'semesterYear'
+    FROM `view_disciplines`
+    INNER JOIN `semesters` ON semesters.ID = view_disciplines.SemesterID
+    WHERE view_disciplines.DisciplineID = pDisciplineID
+    LIMIT 1;
+END //
 
 
 # TODO: haven't reference on it
 # all disciplines for faculty in current semester
 DROP PROCEDURE IF EXISTS GetDisciplines//
-CREATE PROCEDURE `GetDisciplines` (  IN `pFacultyID` INT )
-    NO SQL
+CREATE PROCEDURE `GetDisciplines` (
+    IN `pFacultyID` INT,
+    IN `pSemesterID` INT
+) NO SQL
 BEGIN
-    SELECT  view_disciplines.DisciplineID   AS 'ID',
+    SELECT  view_disciplines.DisciplineID AS 'ID',
             view_disciplines.SubjectID,
             view_disciplines.SubjectName,
-            view_disciplines.ExamType,
-            (view_disciplines_results.DisciplineRateMax = 100) AS 'IsMapCreated'
+            view_disciplines.ExamType AS 'Type',
+            (view_disciplines_results.DisciplineRateMax = 100) AS 'isMapCreated'
         FROM `view_disciplines`
         INNER JOIN `view_disciplines_results`
             ON view_disciplines_results.DisciplineID = view_disciplines.DisciplineID
-        WHERE view_disciplines.SemesterID = @CurrentSemesterID AND
+        WHERE view_disciplines.SemesterID = pSemesterID AND
             view_disciplines.FacultyID = pFacultyID
         ORDER BY view_disciplines.SubjectName ASC;
 END //
@@ -601,11 +881,14 @@ END //
 # processed format of output (after desequentialization)
 # { discipline1 {group1, group2, ...}, discipline2 {groupN, ...}, ... }
 DROP PROCEDURE IF EXISTS GetDisciplinesForTeacher//
-CREATE PROCEDURE `GetDisciplinesForTeacher`(IN `pTeacherID` INT)
+CREATE PROCEDURE `GetDisciplinesForTeacher` (
+        IN `pTeacherID` INT,
+        IN `pSemesterID` INT
+    )
     NO SQL
 BEGIN
     SELECT DISTINCT view_disciplines.DisciplineID AS 'ID',
-                    view_disciplines.ExamType,
+                    view_disciplines.ExamType AS 'Type',
                     view_disciplines.Subtype,
                     view_disciplines.GradeID,
                     view_disciplines.GradeNum,
@@ -615,9 +898,9 @@ BEGIN
                     view_groups.GroupName,
                     view_disciplines.SubjectID,
                     view_disciplines.SubjectName,
-                    (pTeacherID = view_disciplines.AuthorID)   AS 'IsAuthor',
-                    (view_disciplines_results.DisciplineRateMax = 100)    AS 'IsMapCreated',
-                    view_disciplines.IsLocked
+                    view_disciplines.AuthorID,
+                    view_disciplines.IsLocked AS 'IsLocked', # TODO: change column name
+                    (view_disciplines_results.DisciplineRateMax = 100)    AS 'IsMapCreated'
     FROM `disciplines_teachers`
     LEFT JOIN `disciplines_groups` ON disciplines_groups.DisciplineID = disciplines_teachers.DisciplineID
         # left -> inner join with maybe NULL ?
@@ -625,7 +908,7 @@ BEGIN
     LEFT JOIN `view_disciplines` ON disciplines_teachers.DisciplineID = view_disciplines.DisciplineID
     LEFT JOIN `view_disciplines_results` ON view_disciplines_results.DisciplineID = view_disciplines.DisciplineID
     WHERE disciplines_teachers.TeacherID = pTeacherID AND
-            view_disciplines.SemesterID = @CurrentSemesterID
+            view_disciplines.SemesterID = pSemesterID
     ORDER BY    view_disciplines.GradeID ASC,
                 view_disciplines.SubjectName ASC,
                 view_disciplines.DisciplineID ASC,
@@ -635,59 +918,107 @@ END //
 
 # get all disciplines, that student take.
 DROP PROCEDURE IF EXISTS GetDisciplinesForStudent//
-CREATE PROCEDURE `GetDisciplinesForStudent`(IN `pStudentID` INT)
-    NO SQL
+CREATE PROCEDURE `GetDisciplinesForStudent` (
+    IN `pStudentID` INT,
+    IN `pSemesterID` INT
+) NO SQL
 BEGIN
+    DECLARE vStudentGroup INT DEFAULT -1;
+    SET vStudentGroup = GetStudentGroup(pStudentID, pSemesterID);
+
+    # select all disciplines for user
+    CREATE TEMPORARY TABLE IF NOT EXISTS tDisciplines AS (
+        SELECT disc2.DisciplineID
+            FROM (
+                SELECT  disc1.DisciplineID,
+                        COALESCE(disc1.Type) AS 'Type'
+                FROM (
+                        SELECT  disciplines_students.DisciplineID,
+                                disciplines_students.Type
+                            FROM `disciplines_students`
+                            WHERE   disciplines_students.StudentID = pStudentID
+                        UNION
+                        SELECT  disciplines_groups.DisciplineID,
+                                NULL AS 'Type'
+                            FROM `disciplines_groups`
+                            WHERE   disciplines_groups.GroupID = vStudentGroup
+                    ) AS disc1
+                INNER JOIN `disciplines` ON disciplines.ID = disc1.DisciplineID
+                WHERE disciplines.SemesterID = pSemesterID
+                GROUP BY disc1.DisciplineID
+            ) AS disc2
+            WHERE NOT disc2.Type <=> 'detach'
+    );
+
+    # only Cthulhu knows, what happened here
     SELECT  view_disciplines.DisciplineID AS 'ID',
             view_disciplines.SubjectID,
             view_disciplines.SubjectName,
-            view_disciplines.ExamType,
+            view_disciplines.ExamType AS 'Type',
             view_disciplines.Subtype,
-            view_teachers.LastName,
-            view_teachers.FirstName,
-            view_teachers.SecondName,
-            (view_rating_result.RateRegular + view_rating_result.RateExtra +
-                view_rating_result.RateBonus + view_rating_result.RateExam) AS 'Rate',
-            view_disciplines_results.DisciplineRateCur AS 'MaxCurrentRate'
-            # --isMapCreated
-        FROM `view_disciplines_students`
-        INNER JOIN `view_disciplines` ON view_disciplines.DisciplineID = view_disciplines_students.DisciplineID
-        INNER JOIN `view_disciplines_results` ON view_disciplines_results.DisciplineID = view_disciplines_students.DisciplineID
-        LEFT JOIN `view_rating_result` ON  view_rating_result.StudentID = pStudentID AND
-                                            view_rating_result.DisciplineID = view_disciplines_results.DisciplineID
-        INNER JOIN `view_teachers` ON view_teachers.TeacherID = view_disciplines.AuthorID
-        WHERE   view_disciplines_students.SemesterID = @CurrentSemesterID AND
-                view_disciplines.SemesterID = @CurrentSemesterID AND
-                view_disciplines_students.StudentID = pStudentID AND
-                (view_disciplines_students.AttachType IS NULL OR view_disciplines_students.AttachType != 'detach')
+            teachers.LastName,
+            teachers.FirstName,
+            teachers.SecondName,
+            ( tDR.RateExam + tDR.RateMExam ) AS 'Rate',
+            ( tDR.MaxRegularRate + tDR.MaxExamRate ) AS 'MaxCurrentRate'
+        FROM (
+            SELECT  tRating.DisciplineID,
+                    SUM(
+                        IF( tRating.SubmoduleIsUsed AND tRating.ModuleType <=> 'regular',
+                            tRating.SubmoduleRate, 0)
+                    ) AS 'MaxRegularRate',
+                    MAX(
+                        IF( tRating.SubmoduleIsUsed AND tRating.ModuleType <=> 'exam',
+                            tRating.SubmoduleRate, 0)
+                    ) AS 'MaxExamRate',
+                    SUM(IF(NOT tRating.ModuleType <=> 'exam', tRating.Rate, 0)) AS 'RateMExam',
+                    MAX(IF(tRating.ModuleType <=> 'exam' AND tRating.Rate IS NOT NULL, tRating.Rate, 0)) AS 'RateExam'
+                FROM (
+                    SELECT  tDisciplines.DisciplineID,
+                            vr.SubmoduleRate,
+                            vr.ModuleType,
+                            rt.Rate,
+                            vr.SubmoduleIsUsed
+                        FROM `tDisciplines`
+                        LEFT JOIN `view_roadmap` AS vr ON   vr.DisciplineID = tDisciplines.DisciplineID
+                        LEFT JOIN `rating_table` AS rt  ON  rt.StudentID = pStudentID AND
+                                                            rt.SubmoduleID = vr.SubmoduleID
+                ) AS tRating
+                GROUP BY tRating.DisciplineID
+        ) AS tDR
+        INNER JOIN `view_disciplines` ON view_disciplines.DisciplineID = tDR.DisciplineID
+        INNER JOIN `teachers` ON teachers.ID = view_disciplines.AuthorID
         ORDER BY view_disciplines.ExamType ASC, view_disciplines.SubjectName ASC;
 END //
 
 
 # get all disciplines for group, including disciplines, where students have attached status
 DROP PROCEDURE IF EXISTS GetDisciplinesForGroup//
-CREATE PROCEDURE `GetDisciplinesForGroup`(IN `pGroupID` INT)
+CREATE PROCEDURE `GetDisciplinesForGroup` (
+        IN `pGroupID` INT,
+        IN `pSemesterID` INT
+    )
     NO SQL
 BEGIN
-    (SELECT view_disciplines.DisciplineID,
+    (SELECT view_disciplines.DisciplineID  AS 'ID',
             view_disciplines.SubjectName,
             view_disciplines.Subtype,
-            view_disciplines.ExamType
+            view_disciplines.ExamType  AS 'Type'
         FROM `disciplines_groups`
         INNER JOIN `view_disciplines` ON    view_disciplines.DisciplineID = disciplines_groups.DisciplineID AND
-                                            view_disciplines.SemesterID = @CurrentSemesterID
+                                            view_disciplines.SemesterID = pSemesterID
         WHERE disciplines_groups.GroupID = pGroupID
     ) UNION DISTINCT
-    (SELECT view_disciplines.DisciplineID,
+    (SELECT view_disciplines.DisciplineID  AS 'ID',
             view_disciplines.SubjectName,
             view_disciplines.Subtype,
-            view_disciplines.ExamType
+            view_disciplines.ExamType AS 'Type'
         FROM `disciplines_students`
         INNER JOIN `students` ON disciplines_students.StudentID = students.ID
         INNER JOIN `view_disciplines` ON view_disciplines.DisciplineID = disciplines_students.DisciplineID AND
-                                         view_disciplines.SemesterID = @CurrentSemesterID
+                                         view_disciplines.SemesterID = pSemesterID
         INNER JOIN `students_groups` ON students_groups.StudentID = students.ID AND
-                                        students_groups.SemesterID = @CurrentSemesterID
+                                        students_groups.SemesterID = pSemesterID
         WHERE students_groups.GroupID = pGroupID
     );
 END //
@@ -699,17 +1030,23 @@ END //
 # -------------------------------------------------------------------------------------------
 
 DROP PROCEDURE IF EXISTS GetRatesForGroup//
-CREATE PROCEDURE `GetRatesForGroup`
-    (   IN `pDisciplineID` INT, IN `pGroupID` INT)
+CREATE PROCEDURE `GetRatesForGroup` (
+    IN `pDisciplineID` INT,
+    IN `pGroupID` INT)
     NO SQL
 BEGIN
     DECLARE vChecker BOOLEAN DEFAULT FALSE;
+    DECLARE vSemesterID INT DEFAULT -1;
+    SET vSemesterID = GetDisciplineProperty(pDisciplineID, 'semester');
+
     SELECT disciplines_groups.ID IS NOT NULL INTO vChecker
         FROM `disciplines_groups`
         WHERE disciplines_groups.DisciplineID = pDisciplineID AND
               disciplines_groups.GroupID = pGroupID
         LIMIT 1;
 
+
+
     IF !vChecker THEN
         SELECT  students.ID,
             students.LastName,
@@ -722,7 +1059,7 @@ BEGIN
             LEFT JOIN `view_rating_result` ON view_rating_result.DisciplineID = pDisciplineID AND
                                               view_rating_result.StudentID = students.ID
             INNER JOIN `students_groups` ON students_groups.StudentID = students.ID AND
-                                            students_groups.SemesterID = @CurrentSemesterID
+                                            students_groups.SemesterID = vSemesterID
         WHERE students_groups.GroupID = pGroupID AND
               EXISTS(SELECT * FROM `disciplines_students`
               WHERE  disciplines_students.DisciplineID = pDisciplineID AND
@@ -741,7 +1078,7 @@ BEGIN
             LEFT JOIN `view_rating_result` ON view_rating_result.DisciplineID = pDisciplineID AND
                                                view_rating_result.StudentID = students.ID
             INNER JOIN `students_groups` ON students_groups.StudentID = students.ID AND
-                                            students_groups.SemesterID = @CurrentSemesterID
+                                            students_groups.SemesterID = vSemesterID
             WHERE students_groups.GroupID = pGroupID AND
                   NOT EXISTS(SELECT * FROM `disciplines_students`
                                 WHERE  disciplines_students.DisciplineID = pDisciplineID AND
@@ -754,36 +1091,37 @@ END //
 
 DROP PROCEDURE IF EXISTS GetRatesForGroupByStage//
 CREATE PROCEDURE `GetRatesForGroupByStage`
-    ( IN `pDisciplineID` INT, IN `pGroupID` INT, IN `pMilestone` INT)
-    NO SQL
+  ( IN `pDisciplineID` INT, IN `pGroupID` INT, IN `pMilestone` INT)
+NO SQL
 BEGIN
     SELECT  view_disciplines_students.StudentID,
-        view_disciplines_students.LastName As LastName,
-        view_disciplines_students.FirstName As FirstName,
-        view_disciplines_students.SecondName As SecondName,
-        SUM(rating_table.Rate*(view_roadmap.ModuleType = 'regular')) AS 'regular',
-        SUM(rating_table.Rate*(view_roadmap.ModuleType = 'bonus')) AS 'bonus',
-        SUM(rating_table.Rate*(view_roadmap.ModuleType = 'extra')) AS 'extra',
-        SUM(rating_table.Rate*(view_roadmap.ModuleType = 'exam')) AS 'exam'
+        view_disciplines_students.LastName As 'LastName',
+        view_disciplines_students.FirstName As 'FirstName',
+        view_disciplines_students.SecondName As 'SecondName',
+        SUM(rating_table.Rate*(view_roadmap.ModuleType = 'regular')) AS 'Semester',
+        SUM(rating_table.Rate*(view_roadmap.ModuleType = 'bonus')) AS 'Bonus',
+        SUM(rating_table.Rate*(view_roadmap.ModuleType = 'extra')) AS 'Extra',
+        SUM(rating_table.Rate*(view_roadmap.ModuleType = 'exam')*(view_roadmap.SubmoduleOrderNum = pMilestone)) AS 'Exam',
+        MAX(rating_table.Rate*(view_roadmap.ModuleType = 'exam')*(view_roadmap.SubmoduleOrderNum < pMilestone)) AS 'PreviousExam',
+        MAX(IF(view_roadmap.SubmoduleOrderNum = pMilestone, exam_period_options.TYPE, NULL)) As 'Option',
+        MAX(IF(exam_period_options.TYPE = 'pass', 1, 0)) As 'AutoPassed'
     FROM `view_disciplines_students`
-        LEFT JOIN `view_roadmap` ON view_roadmap.DisciplineID = pDisciplineID
+        LEFT JOIN `view_roadmap` ON view_roadmap.DisciplineID = view_disciplines_students.DisciplineID
         LEFT JOIN `rating_table` ON rating_table.StudentID = view_disciplines_students.StudentID AND
-                                    rating_table.SubmoduleID = view_roadmap.SubmoduleID
+                              rating_table.SubmoduleID = view_roadmap.SubmoduleID
+        LEFT JOIN `exam_period_options` ON exam_period_options.submoduleID = view_roadmap.SubmoduleID AND
+                                     exam_period_options.StudentID = view_disciplines_students.StudentID
     WHERE   view_disciplines_students.DisciplineID = pDisciplineID AND
-            view_disciplines_students.GroupID = pGroupID AND
-            NOT view_disciplines_students.AttachType <=> 'detach' AND
-            (   view_roadmap.ModuleType = 'regular' OR view_roadmap.ModuleType = 'bonus' OR
-                (view_roadmap.ModuleType = 'exam' AND view_roadmap.SubmoduleOrderNum = pMilestone) OR
-                (view_roadmap.ModuleType = 'extra' AND view_roadmap.SubmoduleOrderNum < pMilestone )
-            )
+        view_disciplines_students.GroupID = pGroupID AND
+        NOT view_disciplines_students.AttachType <=> 'detach' AND
+        (   view_roadmap.ModuleType <> 'extra'  OR
+            (view_roadmap.ModuleType = 'extra' AND view_roadmap.SubmoduleOrderNum < pMilestone )
+        )
     GROUP BY view_disciplines_students.StudentID
     ORDER BY LastName ASC, FirstName ASC, SecondName ASC;
 END //
 
 
-
-
-
 DROP PROCEDURE IF EXISTS GetRates//
 CREATE PROCEDURE `GetRates`
     (   IN `pStudentID` INT, IN `pDisciplineID` INT)
@@ -798,12 +1136,12 @@ BEGIN
             view_roadmap.ModuleType,
             rating_table.Rate,
             rating_table.Date,
-            session_options.Type
+            exam_period_options.Type As ExamPeriodOption
         FROM `view_roadmap`
         LEFT JOIN `rating_table`    ON  view_roadmap.SubmoduleID = rating_table.SubmoduleID AND
                                         rating_table.StudentID = pStudentID
-        LEFT JOIN `session_options` ON  session_options.StudentID = pStudentID AND
-                                        session_options.SubmoduleID = rating_table.SubmoduleID
+        LEFT JOIN `exam_period_options` ON  exam_period_options.StudentID = pStudentID AND
+                                        exam_period_options.SubmoduleID = rating_table.SubmoduleID
         WHERE   view_roadmap.DisciplineID = pDisciplineID AND
                 (
                     view_roadmap.ModuleType != 'exam' OR
@@ -837,28 +1175,36 @@ BEGIN
             view_roadmap.SubmoduleType,
             rating_table.Rate,
             rating_table.Date,
-            view_roadmap.ModuleType
+            view_roadmap.ModuleType,
+            exam_period_options.Type As ExamPeriodOption
     FROM `view_roadmap`
     LEFT JOIN `rating_table` 	ON 	rating_table.SubmoduleID = view_roadmap.SubmoduleID AND
                                     rating_table.StudentID = pStudentID
+    LEFT JOIN `exam_period_options` ON  exam_period_options.StudentID = pStudentID AND
+                                        exam_period_options.SubmoduleID = view_roadmap.SubmoduleID
     WHERE view_roadmap.DisciplineID = pDisciplineID
     ORDER BY view_roadmap.ModuleOrderNum ASC,
             view_roadmap.SubmoduleOrderNum ASC;
 END //
 
 DROP PROCEDURE IF EXISTS GetAttestationData//
-CREATE PROCEDURE `GetAttestationData`
-    (   IN `pDisciplineID` INT, IN `pGroupID` INT)
+CREATE PROCEDURE `GetAttestationData` (
+        IN `pDisciplineID` INT,
+        IN `pGroupID` INT
+    )
     NO SQL
 BEGIN
-    SELECT    students.ID 	AS 'StudentID',
+    DECLARE vSemesterID INT DEFAULT -1;
+    SET vSemesterID = GetDisciplineProperty(pDisciplineID, 'semester');
+
+    SELECT    students.ID   AS 'StudentID',
               rating_table.Rate As 'Rate',
               rating_table.Date As 'Date',
               submodules.OrderNum As 'OrderNum',
               modules.Type As 'Type'
         FROM `students`
         INNER JOIN `students_groups` ON students_groups.StudentID = students.ID AND
-                                        students_groups.SemesterID = @CurrentSemesterID
+                                        students_groups.SemesterID = vSemesterID
 
         LEFT JOIN `disciplines_groups` ON   disciplines_groups.DisciplineID = pDisciplineID AND
                                             disciplines_groups.GroupID = students_groups.GroupID
@@ -883,10 +1229,11 @@ END //
 
 # -------------------------------------------------------------------------------------------
 # Label: disciplines
-# Label: roadMaps
+# Label: roadmaps
 # -------------------------------------------------------------------------------------------
 
 # TODO: order hardcode
+# TODO: merge with GetRoadmapExam
 # get roadmap of discipline
 DROP PROCEDURE IF EXISTS GetRoadmap//
 CREATE PROCEDURE `GetRoadmap`
@@ -940,34 +1287,6 @@ END //
 
 
 
-# -------------------------------------------------------------------------------------------
-# Label: requests
-# -------------------------------------------------------------------------------------------
-
-# DROP PROCEDURE IF EXISTS GetRequests
-# CREATE PROCEDURE `GetRequests`       (   IN `AccountID` INT,
-#                                      IN `Type` INT # 0 to me, 1 - from me, 3 - all
-#                                  )
-#     NO SQL
-# BEGIN
-#  SELECT  requests.ID, 
-#          requests.To, 
-#          requests.From, 
-#          requests.Field1, 
-#          requests.Field2, 
-#          requests.Field3, 
-#          requests.Data, 
-#          requests.DataExt, 
-#          requests.Date, 
-#          requests.Type, 
-#          requests.Status
-#  FROM `requests`
-#  WHERE ((Type & 1) != 0 AND requests.To = AccountID) OR
-#        ((Type & 2) != 0 AND requests.From = AccountID)
-#      ORDER BY requests.To = AccountID DESC, requests.Type ASC, requests.ID ASC;
-# END
-
-
 
 # -------------------------------------------------------------------------------------------
 # Label: recovery
@@ -1009,42 +1328,16 @@ END //
 
 
 
-# TODO: kill GetRateForDisc
-DROP PROCEDURE IF EXISTS GetReports//
-CREATE PROCEDURE `GetReports` (IN `pGroupID` INT)
-    NO SQL
-BEGIN
-    SELECT  students.ID AS 'StudentID',
-            students.LastName,
-            students.FirstName,
-            students.SecondName,
-            disciplines.ID,
-            GetRateForDisc(students.ID, disciplines.ID) AS 'Rate',
-            GetMaxRateForDisc(disciplines.ID) AS 'MaxRate'
-        FROM `students`
-        LEFT JOIN `disciplines` ON disciplines.ID IN
-            (
-                SELECT disciplines_groups.DisciplineID
-                    FROM `disciplines_groups`
-                    WHERE disciplines_groups.GroupID = pGroupID
-                    UNION DISTINCT
-                    SELECT disciplines_students.DisciplineID
-                    FROM `disciplines_students`
-                    INNER JOIN `students` ON disciplines_students.ID = students.ID
-                    INNER JOIN `students_groups` ON students_groups.StudentID = students.ID AND
-                                                    students_groups.SemesterID = @CurrentSemesterID
-                    WHERE students_groups.GroupID = pGroupID
-            )
-        INNER JOIN `subjects` ON disciplines.SubjectID = subjects.ID
-        INNER JOIN `students_groups` ON students_groups.StudentID = students.ID AND
-                                        students_groups.SemesterID = @CurrentSemesterID
-        WHERE students_groups.GroupID = pGroupID;
-END //
 
+# -------------------------------------------------------------------------------------------
+# Label: miscellaneous
+# -------------------------------------------------------------------------------------------
 
 DROP PROCEDURE IF EXISTS GetFinalFormInfo//
-CREATE PROCEDURE `GetFinalFormInfo`
-(IN `pDisciplineID` INT, IN `pGroupID` INT)
+CREATE PROCEDURE `GetFinalFormInfo` (
+    IN `pDisciplineID` INT,
+    IN `pGroupID` INT
+)
     NO SQL
 BEGIN
     SELECT  study_groups.GroupNum AS 'GroupNum',
@@ -1081,20 +1374,50 @@ BEGIN
         INNER JOIN `teachers` ON teachers.ID = disciplines.AuthorID
         INNER JOIN `departments` ON departments.ID = teachers.DepartmentID
         INNER JOIN `job_positions` ON job_positions.ID = teachers.JobPositionID
-        INNER JOIN `semesters` ON semesters.ID = @CurrentSemesterID
+        INNER JOIN `semesters` ON disciplines.SemesterID
         WHERE study_groups.ID = pGroupID
         LIMIT 1;
 END //
 
 DROP PROCEDURE IF EXISTS GetSession //
 CREATE PROCEDURE GetSession (IN pID INT(11), OUT pSessionID VARCHAR(40), OUT pUserLogin VARCHAR(50) CHARSET utf8, OUT pUserPassword VARCHAR(64))
-	NO SQL
+    NO SQL
 BEGIN
 
-	SELECT SessionID, Login, Password 
-		INTO pSessionID, pUserLogin, pUserPassword
-		FROM sessions
-		WHERE sessions.ID=pID;
+    SELECT SessionID, Login, Password
+        INTO pSessionID, pUserLogin, pUserPassword
+        FROM sessions
+        WHERE sessions.ID=pID;
+END //
+
+
+DROP PROCEDURE IF EXISTS Student_GetInfo //
+CREATE PROCEDURE Student_GetInfo(
+    IN pID INT(11)
+)   NO SQL
+BEGIN
+    SELECT
+        view_students.StudentID   AS 'ID',
+        view_students.LastName,
+        view_students.FirstName,
+        view_students.SecondName,
+        view_students.AccountID,
+        view_students.SemesterID,
+        view_students.GroupID,
+        view_students.GroupNum,
+        view_students.GroupName,
+        view_students.GradeID,
+        view_students.GradeNum,
+        view_students.Degree,
+        view_students.SpecID,
+        view_students.SpecName,
+        view_students.SpecAbbr,
+        view_students.SpecCode,
+        view_students.FacultyID,
+        view_students.FacultyName,
+        view_students.FacultyAbbr
+    FROM `view_students` WHERE pID = view_students.StudentID
+    LIMIT 1;
 END //
 
 DELIMITER ;
\ No newline at end of file
diff --git a/db/Structure.sql b/db/Structure.sql
index e88e11cb9300dbe05c60cdd13d92332332acc50f..5825317b6a282aa7285f8452f0bb03e6c60fd420 100644
--- a/db/Structure.sql
+++ b/db/Structure.sql
@@ -168,20 +168,6 @@ CREATE TABLE IF NOT EXISTS `faculties` (
   UNIQUE KEY `Name` (`Name`)
 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
 
--- --------------------------------------------------------
-
---
--- Структура таблицы `general_settings`
---
-
-CREATE TABLE IF NOT EXISTS `general_settings` (
-  `ID` int(11) NOT NULL AUTO_INCREMENT,
-  `Val` int(11) DEFAULT NULL,
-  `ValS` varchar(300) CHARACTER SET utf8 DEFAULT NULL,
-  `Name` varchar(50) CHARACTER SET utf8 NOT NULL,
-  PRIMARY KEY (`ID`)
-) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
-
 
 -- --------------------------------------------------------
 
@@ -239,18 +225,7 @@ CREATE TABLE IF NOT EXISTS `modules` (
   KEY `DisciplineID` (`DisciplineID`)
 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
 
--- --------------------------------------------------------
 
---
--- Структура таблицы `page_access`
---
-
-CREATE TABLE IF NOT EXISTS `page_access` (
-  `ID` int(11) NOT NULL AUTO_INCREMENT,
-  `Pagename` text CHARACTER SET utf8 NOT NULL,
-  `Bitmask` int(11) NOT NULL,
-  PRIMARY KEY (`ID`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 -- --------------------------------------------------------
 
@@ -539,14 +514,14 @@ CREATE TABLE IF NOT EXISTS `students_groups` (
 -- --------------------------------------------------------
 
 --
--- Структура таблицы `session_options`
+-- Структура таблицы `exam_period_options`
 --
 
-CREATE TABLE IF NOT EXISTS `session_options` (
+CREATE TABLE IF NOT EXISTS `exam_period_options` (
   `ID` int(11) NOT NULL AUTO_INCREMENT,
   `SubmoduleID` int(11) NOT NULL,
   `StudentID` int(11) NOT NULL,
-  `Type` enum('absence','pass') NOT NULL,
+  `Type` enum('absence','pass'),
   PRIMARY KEY (`ID`),
   UNIQUE KEY `SubmoduleID` (`SubmoduleID`,`StudentID`),
   KEY `SubmoduleID_2` (`SubmoduleID`),
@@ -572,45 +547,7 @@ INSERT INTO `user_roles` (`ID`, `Type`, `RoleName`, `Mark`) VALUES
 (3, 'teacher', 'Преподаватель-Администратор', 31),
 (4, 'teacher', 'Работник деканата', 21);
 
---
--- Дамп данных таблицы `user_roles`
---
-
-
 
-INSERT INTO `page_access` (`ID`, `Pagename`, `Bitmask`) VALUES
-(1, 'common:index', 1),
-(2, 'common:settings', 1),
-(3, 'common:profile', 1),
-(4, 'teacher:index', 4),
-(5, 'teacher:settings', 4),
-(6, 'teacher:map:create', 4),
-(7, 'teacher:map:edit', 4),
-(8, 'teacher:rating', 4),
-(9, 'teacher:profile', 4),
-(10, 'admin:common', 8),
-(11, 'student:index', 2),
-(12, 'student:settings', 2),
-(13, 'student:subject', 2),
-(14, 'teacher:map:discipline', 4),
-(15, 'teacher:map:structure', 4),
-(16, 'teacher:map:groups', 4),
-(17, 'teacher:map:students', 4),
-(18, 'teacher:map:teachers', 4),
-(19, 'handler:AdmAccounts', 8),
-(20, 'handler:AdmStudents', 8),
-(21, 'handler:AdmTeachers', 8),
-(22, 'handler:GetHelp', 1),
-(23, 'handler:Map', 4),
-(24, 'handler:Rating', 4),
-(25, 'handler:Settings', 1),
-(26, 'teacher:exam', 4),
-(27, 'dean_office:index', 16);
-
-
-INSERT INTO `general_settings` (`ID`, `Val`, `ValS`) VALUES
-(1, 1, NULL),
-(2, NULL, 'sdhrhsdrh');
 
 --
 -- Ограничения внешнего ключа сохраненных таблиц
@@ -757,11 +694,11 @@ ALTER TABLE  `students_groups`
 
 
 --
--- Ограничения внешнего ключа таблицы `session_options`
+-- Ограничения внешнего ключа таблицы `exam_period_options`
 --
-ALTER TABLE `session_options`
-  ADD CONSTRAINT `session_options_ibfk_2` FOREIGN KEY (`StudentID`) REFERENCES `students` (`ID`),
-  ADD CONSTRAINT `session_options_ibfk_1` FOREIGN KEY (`SubmoduleID`) REFERENCES `submodules` (`ID`);
+ALTER TABLE `exam_period_options`
+  ADD CONSTRAINT `exam_period_options_ibfk_2` FOREIGN KEY (`StudentID`) REFERENCES `students` (`ID`),
+  ADD CONSTRAINT `exam_period_options_ibfk_1` FOREIGN KEY (`SubmoduleID`) REFERENCES `submodules` (`ID`);
 
 
 
diff --git a/db/Views.sql b/db/Views.sql
index 43893d1fb7c8cbe640cff1081dbe28fd080dda0c..130849a4ae4f9f5e58ede56fa565633fe8d5b96b 100644
--- a/db/Views.sql
+++ b/db/Views.sql
@@ -1,3 +1,5 @@
+DROP VIEW IF EXISTS view_disciplines_teachers;
+
 
 
 
@@ -79,49 +81,31 @@ CREATE OR REPLACE VIEW `view_disciplines` AS
         INNER JOIN `grades` ON grades.ID = disciplines.GradeID;
 
 
-CREATE OR REPLACE VIEW `view_disciplines_results` AS
-    SELECT  disciplines.ID AS 'DisciplineID',
-            SUM(submodules.MaxRate) AS 'DisciplineRateMax',
-            SUM(submodules.MaxRate*submodules.IsUsed) AS 'DisciplineRateCur'
-        FROM `submodules`
-        INNER JOIN `modules` ON modules.ID = submodules.ModuleID
-        RIGHT JOIN `disciplines` ON disciplines.ID = modules.DisciplineID
-        WHERE (modules.Type = 'regular') OR (modules.Type = 'exam' AND submodules.OrderNum = 1)
-        GROUP BY disciplines.ID;
-
 
-CREATE OR REPLACE VIEW `view_disciplines_teachers` AS 
-    SELECT  view_disciplines.DisciplineID,
-            view_teachers.*,
-            (view_disciplines.AuthorID = view_teachers.TeacherID) AS 'IsAuthor'
-        FROM `view_disciplines`
-        LEFT JOIN `disciplines_teachers` ON disciplines_teachers.DisciplineID = view_disciplines.DisciplineID
-        INNER JOIN `view_teachers` ON view_teachers.TeacherID = disciplines_teachers.TeacherID;
 
-
-CREATE OR REPLACE VIEW `view_disciplines_students` AS 
-    (SELECT disciplines_students.DisciplineID,
+CREATE OR REPLACE VIEW `view_disciplines_students` AS (
+    SELECT disciplines_students.DisciplineID,
             disciplines_students.Type AS 'AttachType',
             view_students.*
         FROM `disciplines`
         LEFT JOIN `disciplines_students` ON disciplines_students.DisciplineID = disciplines.ID
         INNER JOIN `view_students` ON   view_students.StudentID = disciplines_students.StudentID AND
                                         view_students.SemesterID = disciplines.SemesterID
-    ) UNION
-    (SELECT disciplines_groups.DisciplineID,
+) UNION (
+    SELECT disciplines_groups.DisciplineID,
             NULL AS 'AttachType',
             view_students.*
         FROM `disciplines`
         LEFT JOIN `disciplines_groups` ON disciplines_groups.DisciplineID = disciplines.ID
         LEFT JOIN `view_students` ON view_students.GroupID = disciplines_groups.GroupID AND
                                      view_students.SemesterID = disciplines.SemesterID
-        WHERE NOT EXISTS 
-            (SELECT disciplines_students.StudentID
+        WHERE NOT EXISTS (
+            SELECT disciplines_students.StudentID
                 FROM `disciplines_students`
                 WHERE disciplines_students.DisciplineID = disciplines_groups.DisciplineID AND
                     disciplines_students.StudentID = view_students.StudentID
             )
-    );
+);
 
 
 CREATE OR REPLACE VIEW `view_roadmap` AS
@@ -129,19 +113,31 @@ CREATE OR REPLACE VIEW `view_roadmap` AS
             modules.ID AS 'ModuleID',
             modules.Name AS 'ModuleName',
             modules.OrderNum AS 'ModuleOrderNum',
-            modules.Type AS 'ModuleType', 
-            # enum('regular','exam', 'bonus', 'extra')
+            modules.Type AS 'ModuleType', # enum('regular','exam', 'bonus', 'extra')
             submodules.ID AS 'SubmoduleID',
             submodules.Name AS 'SubmoduleName',
             submodules.OrderNum AS 'SubmoduleOrderNum',
             submodules.MaxRate AS 'SubmoduleRate',
-            submodules.Type AS 'SubmoduleType',
-            # enum('CurrentControl','LandmarkControl')
+            submodules.Type AS 'SubmoduleType', # enum('CurrentControl','LandmarkControl')
             submodules.IsUsed AS 'SubmoduleIsUsed'
         FROM `modules`
         LEFT JOIN `submodules` ON submodules.ModuleID = modules.ID;
 
 
+CREATE OR REPLACE VIEW `view_disciplines_results` AS
+    SELECT  disciplines.ID AS 'DisciplineID',
+            SUM(submodules.MaxRate) AS 'DisciplineRateMax',
+            SUM(submodules.MaxRate*submodules.IsUsed) AS 'DisciplineRateCur'
+        FROM `disciplines`
+        LEFT JOIN `modules` ON modules.DisciplineID = disciplines.ID
+        LEFT JOIN `submodules` ON submodules.ModuleID = modules.ID
+        WHERE   modules.Type = 'regular' OR
+                (modules.Type = 'exam' AND submodules.OrderNum = 1)
+        GROUP BY disciplines.ID;
+
+
+
+
 # without students, that haven't any rate
 CREATE OR REPLACE VIEW `view_rating_result` AS
     SELECT  rating_table.StudentID,
@@ -149,11 +145,15 @@ CREATE OR REPLACE VIEW `view_rating_result` AS
             SUM(rating_table.Rate*(view_roadmap.ModuleType = 'regular')) AS 'RateRegular',
             SUM(rating_table.Rate*(view_roadmap.ModuleType = 'extra')) AS 'RateExtra',
             SUM(rating_table.Rate*(view_roadmap.ModuleType = 'bonus')) AS 'RateBonus',
-            (SELECT rating_table.Rate*(view_roadmap.ModuleType = 'exam')
-             ORDER BY    view_roadmap.ModuleType = 'exam' DESC,
-                 (rating_table.Rate IS NULL) ASC,
-                 view_roadmap.SubmoduleOrderNum DESC
-             LIMIT 1
+            (SELECT rt.Rate*(vr.ModuleType = 'exam')
+                FROM rating_table AS rt
+                LEFT JOIN `view_roadmap` AS vr ON vr.SubmoduleID = rt.SubmoduleID
+                WHERE vr.DisciplineID = view_roadmap.DisciplineID AND
+                        rt.StudentID = rating_table.StudentID
+                ORDER BY vr.ModuleType = 'exam' DESC,
+                 (rt.Rate IS NULL) ASC,
+                 vr.SubmoduleOrderNum DESC
+                LIMIT 1
             ) AS 'RateExam'
         FROM `rating_table`
         LEFT JOIN `view_roadmap` ON view_roadmap.SubmoduleID = rating_table.SubmoduleID
diff --git a/db/fix.sql b/db/fix.sql
index aa21a5bcdce486e10855e1e0be8f48a545472b46..64e31b1f7bc0356a45461f2ddf866cddd3e95784 100644
--- a/db/fix.sql
+++ b/db/fix.sql
@@ -1,25 +1,28 @@
-# 24.05.15
+# 03.06.15
 
-ALTER TABLE  `disciplines` CHANGE  `ExamType`  `ExamType` ENUM(  'exam',  'credit',  'grading_credit' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ;
-ALTER TABLE  `disciplines` ADD  `Subtype` ENUM(  'scientific_coursework',  'disciplinary_coursework' ) NULL DEFAULT NULL ;
-ALTER TABLE  `disciplines` CHANGE  `isMilestone`  `Milestone` INT( 11 ) NOT NULL DEFAULT  '0';
+DROP TABLE `session_options`;
+CREATE TABLE IF NOT EXISTS `exam_period_options` (
+  `ID` int(11) NOT NULL AUTO_INCREMENT,
+  `SubmoduleID` int(11) NOT NULL,
+  `StudentID` int(11) NOT NULL,
+  `Type` enum('absence','pass'),
+  PRIMARY KEY (`ID`),
+  UNIQUE KEY `SubmoduleID` (`SubmoduleID`,`StudentID`),
+  KEY `SubmoduleID_2` (`SubmoduleID`),
+  KEY `StudentID` (`StudentID`),
+  KEY `StudentID_2` (`StudentID`),
+  KEY `StudentID_3` (`StudentID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
 
 
-CREATE TABLE IF NOT EXISTS `session_options` (
-    `ID` int(11) NOT NULL AUTO_INCREMENT,
-    `SubmoduleID` int(11) NOT NULL,
-    `StudentID` int(11) NOT NULL,
-    `Type` enum('absence','pass') NOT NULL,
-    PRIMARY KEY (`ID`),
-    UNIQUE KEY `SubmoduleID` (`SubmoduleID`,`StudentID`),
-    KEY `SubmoduleID_2` (`SubmoduleID`),
-    KEY `StudentID` (`StudentID`),
-    KEY `StudentID_2` (`StudentID`),
-    KEY `StudentID_3` (`StudentID`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
+ALTER TABLE `exam_period_options`
+ADD CONSTRAINT `exam_period_options_ibfk_2` FOREIGN KEY (`StudentID`) REFERENCES `students` (`ID`),
+ADD CONSTRAINT `exam_period_options_ibfk_1` FOREIGN KEY (`SubmoduleID`) REFERENCES `submodules` (`ID`);
+
+UPDATE `subjects` SET `Name`= "Научная  исследовательская работа", `Abbr` = "Курсовая" WHERE `ID` = 346;
+
 
-ALTER TABLE `session_options`
-ADD CONSTRAINT `session_options_ibfk_2` FOREIGN KEY (`StudentID`) REFERENCES `students` (`ID`),
-ADD CONSTRAINT `session_options_ibfk_1` FOREIGN KEY (`SubmoduleID`) REFERENCES `submodules` (`ID`);
+# 13.05.15
 
-UPDATE `subjects` SET `Name`= "Курсовая работа", `Abbr` = "Курсовая" WHERE `ID` = 346;
+DROP TABLE `page_access`;
+DROP TABLE `general_settings`;
diff --git a/db/tables_MMCSRatingReports.sql b/db/tables_MMCSRatingReports.sql
index 67441fe4d1aa4384f513e7cb52ebcbd58239d6ff..df5980c5fa1d6e98094bfe3ce5b27bab2e15b0f8 100644
--- a/db/tables_MMCSRatingReports.sql
+++ b/db/tables_MMCSRatingReports.sql
@@ -25,14 +25,6 @@ CREATE TABLE `reports_params` (
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
 
-INSERT INTO `report_params`  VALUES (null,'Курс','courseNum','\\d','Курс должен быть целой положительной цифрой',NULL,NULL);
-INSERT INTO `report_params`  VALUES (null,'Группа','groupNum','\\d{1,2}','Группа должна быть целым положительным числом',NULL,NULL);
-INSERT INTO `report_params`  VALUES (null,'Ученая степень','degree',NULL,NULL,'select distinct degree from grades group by id',1);
-INSERT INTO `report_params`  VALUES (null,'Ид. дисциплины','disciplineId','\\d+','\\d+',NULL,0);
-INSERT INTO `report_params`  VALUES (null,'Ид. группы','groupId','\\d+','\\d+',NULL,0);
-INSERT INTO `report_params`  VALUES (null,'Ид.семестра','semId','\\d+','\\d+',NULL,0);
-INSERT INTO `report_params`  VALUES (null,'Послеэкз. признак','isAfterExam','[01]','[01]',NULL,0);
-
 CREATE TABLE `text_mark` (
   `id` int(10) NOT NULL AUTO_INCREMENT,
   `name` varchar(100) NOT NULL,
@@ -89,4 +81,45 @@ BEGIN
     select name from text_mark where id = markTextId into markText;
     return markText;
 END//
-DELIMITER ;
\ No newline at end of file
+DELIMITER ;
+
+
+INSERT INTO `report_params` (`id`, `name`, `varName`, `regex`, `regexMes`, `valueExpr`, `wrapValues`) VALUES
+(1, 'Курс', 'courseNum', '\\d', 'Курс должен быть целой положительной цифрой', NULL, NULL),
+(2, 'Группа', 'groupNum', '\\d{1,2}', 'Группа должна быть целым положительным числом', NULL, NULL),
+(3, 'Ученая степень', 'degree', NULL, NULL, 'select distinct degree from grades group by id', 1),
+(4, 'Ид. дисциплины', 'disciplineId', '\\d+', 'Идентификатор должен быть целым положительным числом', NULL, 0),
+(5, 'Ид. группы', 'groupId', '\\d+', 'Идентификатор должен быть целым положительным числом', NULL, 0),
+(6, 'Ид. семестра', 'semId', '\\d+', 'Идентификатор должен быть целым положительным числом', NULL, 0),
+(7, 'Послеэкз. признак', 'isAfterExam', '[01]', 'Послеэкз. признак может принимать значение 0 или 1', NULL, 0),
+(8, 'Семестр', 'semester', NULL, NULL, 'select concat(`year`, '', '', num)  from semesters order by id desc', NULL);
+
+
+INSERT INTO `reports` (`id`, `file_name`, `descr`, `with_params`, `report`) VALUES
+(4, 'sheet.jasper', 'Ведомость', 1, 0xaced0005737200286e65742e73662e6a61737065727265706f7274732e656e67696e652e4a61737065725265706f727400000000000027d80200034c000b636f6d70696c65446174617400164c6a6176612f696f2f53657269616c697a61626c653b4c0011636f6d70696c654e616d655375666669787400124c6a6176612f6c616e672f537472696e673b4c000d636f6d70696c6572436c61737371007e00027872002d6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173655265706f727400000000000027d802002a49001950534555444f5f53455249414c5f56455253494f4e5f55494449000c626f74746f6d4d617267696e49000b636f6c756d6e436f756e7449000d636f6c756d6e53706163696e6749000b636f6c756d6e57696474685a001069676e6f7265506167696e6174696f6e5a00136973466c6f6174436f6c756d6e466f6f7465725a0010697353756d6d6172794e6577506167655a0020697353756d6d6172795769746850616765486561646572416e64466f6f7465725a000e69735469746c654e65775061676549000a6c6566744d617267696e42000b6f7269656e746174696f6e49000a7061676548656967687449000970616765576964746842000a7072696e744f7264657249000b72696768744d617267696e490009746f704d617267696e42000e7768656e4e6f44617461547970654c000a6261636b67726f756e647400244c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5242616e643b4c000f636f6c756d6e446972656374696f6e7400334c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f52756e446972656374696f6e456e756d3b4c000c636f6c756d6e466f6f74657271007e00044c000c636f6c756d6e48656164657271007e00045b000864617461736574737400285b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52446174617365743b4c000c64656661756c745374796c657400254c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525374796c653b4c000664657461696c71007e00044c000d64657461696c53656374696f6e7400274c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5253656374696f6e3b4c0012666f726d6174466163746f7279436c61737371007e00024c000a696d706f72747353657474000f4c6a6176612f7574696c2f5365743b4c00086c616e677561676571007e00024c000e6c61737450616765466f6f74657271007e00044c000b6d61696e446174617365747400274c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52446174617365743b4c00046e616d6571007e00024c00066e6f4461746171007e00044c00106f7269656e746174696f6e56616c75657400324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4f7269656e746174696f6e456e756d3b4c000a70616765466f6f74657271007e00044c000a7061676548656164657271007e00044c000f7072696e744f7264657256616c75657400314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f5072696e744f72646572456e756d3b5b00067374796c65737400265b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525374796c653b4c000773756d6d61727971007e00045b000974656d706c6174657374002f5b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525265706f727454656d706c6174653b4c00057469746c6571007e00044c00137768656e4e6f446174615479706556616c75657400354c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f5768656e4e6f4461746154797065456e756d3b78700000c5460000001400000001000000000000022b000000000000000014000000034a00000253000000001400000014007372002b6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736542616e6400000000000027d802000749001950534555444f5f53455249414c5f56455253494f4e5f5549444900066865696768745a000e697353706c6974416c6c6f7765644c00137072696e745768656e45787072657373696f6e74002a4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5245787072657373696f6e3b4c000d70726f706572746965734d617074002d4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5250726f706572746965734d61703b4c000973706c6974547970657400104c6a6176612f6c616e672f427974653b4c000e73706c69745479706556616c75657400304c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f53706c697454797065456e756d3b787200336e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365456c656d656e7447726f757000000000000027d80200024c00086368696c6472656e7400104c6a6176612f7574696c2f4c6973743b4c000c656c656d656e7447726f757074002c4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52456c656d656e7447726f75703b7870737200136a6176612e7574696c2e41727261794c6973747881d21d99c7619d03000149000473697a6578700000000077040000000078700000c54600000000017070707e72002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e53706c697454797065456e756d00000000000000001200007872000e6a6176612e6c616e672e456e756d00000000000000001200007870740007535452455443487e7200316e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e52756e446972656374696f6e456e756d00000000000000001200007871007e001d7400034c54527070757200285b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a52446174617365743b4c1a3698cdac9c440200007870000000027372002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173654461746173657400000000000027d802001149001950534555444f5f53455249414c5f56455253494f4e5f5549445a000669734d61696e4200177768656e5265736f757263654d697373696e67547970655b00066669656c64737400265b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a524669656c643b4c001066696c74657245787072657373696f6e71007e00125b000667726f7570737400265b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5247726f75703b4c00046e616d6571007e00025b000a706172616d657465727374002a5b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52506172616d657465723b4c000d70726f706572746965734d617071007e00134c000571756572797400254c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5251756572793b4c000e7265736f7572636542756e646c6571007e00024c000e7363726970746c6574436c61737371007e00025b000a7363726970746c65747374002a5b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525363726970746c65743b5b000a736f72744669656c647374002a5b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52536f72744669656c643b4c0004757569647400104c6a6176612f7574696c2f555549443b5b00097661726961626c65737400295b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525661726961626c653b4c001c7768656e5265736f757263654d697373696e675479706556616c756574003e4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f5768656e5265736f757263654d697373696e6754797065456e756d3b78700000c5460000757200265b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a524669656c643b023cdfc74e2af2700200007870000000087372002c6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173654669656c6400000000000027d80200054c000b6465736372697074696f6e71007e00024c00046e616d6571007e00024c000d70726f706572746965734d617071007e00134c000e76616c7565436c6173734e616d6571007e00024c001276616c7565436c6173735265616c4e616d6571007e000278707074000249447372002b6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5250726f706572746965734d617000000000000027d80200034c00046261736571007e00134c000e70726f706572746965734c69737471007e00174c000d70726f706572746965734d617074000f4c6a6176612f7574696c2f4d61703b78707070707400116a6176612e6c616e672e496e7465676572707371007e00327400007400084c6173744e616d657371007e00357070707400106a6176612e6c616e672e537472696e67707371007e003274000074000946697273744e616d657371007e003570707071007e003d707371007e003274000074000a5365636f6e644e616d657371007e003570707071007e003d707371007e00327074000c696e7465726d6564696174657371007e003570707071007e0038707371007e003270740005626f6e75737371007e003570707071007e0038707371007e0032707400046578616d7371007e003570707071007e0038707371007e00327400007400046d61726b7371007e003570707071007e003d70707074000f53747564656e7473446174615365747572002a5b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a52506172616d657465723b22000c8d2ac36021020000787000000017737200306e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365506172616d6574657200000000000027d80200095a000e6973466f7250726f6d7074696e675a000f697353797374656d446566696e65644c001664656661756c7456616c756545787072657373696f6e71007e00124c000b6465736372697074696f6e71007e00024c00046e616d6571007e00024c000e6e6573746564547970654e616d6571007e00024c000d70726f706572746965734d617071007e00134c000e76616c7565436c6173734e616d6571007e00024c001276616c7565436c6173735265616c4e616d6571007e000278700101707074000e5245504f52545f434f4e54455854707371007e00357070707400296e65742e73662e6a61737065727265706f7274732e656e67696e652e5265706f7274436f6e74657874707371007e0056010170707400155245504f52545f504152414d45544552535f4d4150707371007e003570707074000d6a6176612e7574696c2e4d6170707371007e0056010170707400164a41535045525f5245504f5254535f434f4e54455854707371007e00357070707400306e65742e73662e6a61737065727265706f7274732e656e67696e652e4a61737065725265706f727473436f6e74657874707371007e00560101707074000d4a41535045525f5245504f5254707371007e00357070707400286e65742e73662e6a61737065727265706f7274732e656e67696e652e4a61737065725265706f7274707371007e0056010170707400115245504f52545f434f4e4e454354494f4e707371007e00357070707400136a6176612e73716c2e436f6e6e656374696f6e707371007e0056010170707400105245504f52545f4d41585f434f554e54707371007e003570707071007e0038707371007e0056010170707400125245504f52545f444154415f534f55524345707371007e00357070707400286e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5244617461536f75726365707371007e0056010170707400105245504f52545f5343524950544c4554707371007e003570707074002f6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5241627374726163745363726970746c6574707371007e00560101707074000d5245504f52545f4c4f43414c45707371007e00357070707400106a6176612e7574696c2e4c6f63616c65707371007e0056010170707400165245504f52545f5245534f555243455f42554e444c45707371007e00357070707400186a6176612e7574696c2e5265736f7572636542756e646c65707371007e0056010170707400105245504f52545f54494d455f5a4f4e45707371007e00357070707400126a6176612e7574696c2e54696d655a6f6e65707371007e0056010170707400155245504f52545f464f524d41545f464143544f5259707371007e003570707074002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e7574696c2e466f726d6174466163746f7279707371007e0056010170707400135245504f52545f434c4153535f4c4f41444552707371007e00357070707400156a6176612e6c616e672e436c6173734c6f61646572707371007e00560101707074001a5245504f52545f55524c5f48414e444c45525f464143544f5259707371007e00357070707400206a6176612e6e65742e55524c53747265616d48616e646c6572466163746f7279707371007e0056010170707400145245504f52545f46494c455f5245534f4c564552707371007e003570707074002d6e65742e73662e6a61737065727265706f7274732e656e67696e652e7574696c2e46696c655265736f6c766572707371007e0056010170707400105245504f52545f54454d504c41544553707371007e00357070707400146a6176612e7574696c2e436f6c6c656374696f6e707371007e00560101707074000b534f52545f4649454c4453707371007e003570707074000e6a6176612e7574696c2e4c697374707371007e00560101707074000646494c544552707371007e00357070707400296e65742e73662e6a61737065727265706f7274732e656e67696e652e4461746173657446696c746572707371007e0056010070707400086469736369704964707371007e00357070707400106a6176612e6c616e672e537472696e67707371007e00560100707074000767726f75704964707371007e00357070707400106a6176612e6c616e672e537472696e67707371007e00560100707074000573656d4964707371007e00357070707400106a6176612e6c616e672e537472696e67707371007e00560100707074000b697341667465724578616d707371007e00357070707400106a6176612e6c616e672e537472696e67707371007e0056010070707400086578616d54797065707371007e00357070707400106a6176612e6c616e672e537472696e67707371007e00357070707372002c6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365517565727900000000000027d80200025b00066368756e6b7374002b5b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5251756572794368756e6b3b4c00086c616e677561676571007e000278707572002b5b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5251756572794368756e6b3b409f00a1e8ba34a402000078700000000b737200316e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736551756572794368756e6b00000000000027d8020004420004747970654c00047465787471007e00024c000e746f6b656e536570617261746f727400154c6a6176612f6c616e672f4368617261637465723b5b0006746f6b656e737400135b4c6a6176612f6c616e672f537472696e673b7870017400cd53454c454354200a2020202076732e73747564656e74496420617320604944602c0a2020202076732e4c6173744e616d652c200a2020202076732e46697273744e616d652c200a2020202076732e5365636f6e644e616d652c0a202020207672722e52617465526567756c61722061732060696e7465726d656469617465602c200a202020207672722e52617465426f6e75732061732060626f6e7573602c200a202020207672722e526174654578616d20617320606578616d602c0a20202020676574546578744d61726b2870707371007e00b80274000b697341667465724578616d70707371007e00b8017400022c2070707371007e00b8027400086578616d5479706570707371007e00b8017401672c0a202020202020202069662869666e756c6c287672722e52617465526567756c61722c203029203c20302c20302c2069666e756c6c287672722e52617465526567756c61722c20302929202b0a202020202020202069662869666e756c6c287672722e52617465426f6e75732c2020203029203c20302c20302c2069666e756c6c287672722e52617465426f6e75732c202020302929202b0a202020202020202069662869666e756c6c287672722e526174654578616d202c2020203029203c20302c20302c2069666e756c6c287672722e526174654578616d202c2020203029290a2020202029206173206d61726b0a46524f4d200a2020202060766965775f73747564656e747360207673200a202020206a6f696e20766965775f726174696e675f726573756c7420767272206f6e207672722e73747564656e746964203d2076732e73747564656e74696420616e64207672722e6469736369706c696e654964203d2070707371007e00b802740008646973636970496470707371007e00b8017400180a5748455245200a2020202076732e67726f757049643d2070707371007e00b80274000767726f7570496470707371007e00b80174001a200a20202020616e642076732e73656d65737465724964203d2070707371007e00b80274000573656d496470707371007e00b80174000f0a6f7264657220627920322c332c34707074000373716c707070707372000e6a6176612e7574696c2e55554944bc9903f7986d852f0200024a000c6c65617374536967426974734a000b6d6f7374536967426974737870ba64699b0d3e9eecdd7fe12f6b0d48b7757200295b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a525661726961626c653b62e6837c982cb7440200007870000000067372002f6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173655661726961626c6500000000000027d802001149001950534555444f5f53455249414c5f56455253494f4e5f55494442000b63616c63756c6174696f6e42000d696e6372656d656e74547970655a000f697353797374656d446566696e65644200097265736574547970654c001063616c63756c6174696f6e56616c75657400324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f43616c63756c6174696f6e456e756d3b4c000a65787072657373696f6e71007e00124c000e696e6372656d656e7447726f75707400254c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5247726f75703b4c0012696e6372656d656e745479706556616c75657400344c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f496e6372656d656e7454797065456e756d3b4c001b696e6372656d656e746572466163746f7279436c6173734e616d6571007e00024c001f696e6372656d656e746572466163746f7279436c6173735265616c4e616d6571007e00024c0016696e697469616c56616c756545787072657373696f6e71007e00124c00046e616d6571007e00024c000a726573657447726f757071007e00d84c000e72657365745479706556616c75657400304c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f526573657454797065456e756d3b4c000e76616c7565436c6173734e616d6571007e00024c001276616c7565436c6173735265616c4e616d6571007e00027870000077ee000001007e7200306e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e43616c63756c6174696f6e456e756d00000000000000001200007871007e001d74000653595354454d70707e7200326e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e496e6372656d656e7454797065456e756d00000000000000001200007871007e001d7400044e4f4e457070737200316e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736545787072657373696f6e00000000000027d802000449000269645b00066368756e6b737400305b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5245787072657373696f6e4368756e6b3b4c000e76616c7565436c6173734e616d6571007e00024c001276616c7565436c6173735265616c4e616d6571007e0002787000000000757200305b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5245787072657373696f6e4368756e6b3b6d59cfde694ba355020000787000000001737200366e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736545787072657373696f6e4368756e6b00000000000027d8020002420004747970654c00047465787471007e00027870017400186e6577206a6176612e6c616e672e496e7465676572283129707074000b504147455f4e554d424552707e72002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e526573657454797065456e756d00000000000000001200007871007e001d7400065245504f525471007e0038707371007e00d6000077ee0000010071007e00dd707071007e00e070707371007e00e2000000017571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e7465676572283129707074000d434f4c554d4e5f4e554d424552707e71007e00eb7400045041474571007e0038707371007e00d6000077ee000001007e71007e00dc740005434f554e547371007e00e2000000027571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00e070707371007e00e2000000037571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e7465676572283029707074000c5245504f52545f434f554e547071007e00ec71007e0038707371007e00d6000077ee0000010071007e00f77371007e00e2000000047571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00e070707371007e00e2000000057571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e7465676572283029707074000a504147455f434f554e547071007e00f471007e0038707371007e00d6000077ee0000010071007e00f77371007e00e2000000067571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00e070707371007e00e2000000077571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e7465676572283029707074000c434f4c554d4e5f434f554e54707e71007e00eb740006434f4c554d4e71007e0038707371007e00d6000077ee000000007e71007e00dc7400074e4f5448494e477371007e00e2000000087571007e00e5000000137371007e00e701740001287371007e00e70374000c696e7465726d6564696174657371007e00e70174000c203d3d206e756c6c207c7c207371007e00e70374000c696e7465726d6564696174657371007e00e70174000b203c2030203f2030203a207371007e00e70374000c696e7465726d6564696174657371007e00e701740005290a2b0a287371007e00e703740005626f6e75737371007e00e70174000c203d3d206e756c6c207c7c207371007e00e703740005626f6e75737371007e00e70174000b203c2030203f2030203a207371007e00e703740005626f6e75737371007e00e701740005290a2b0a287371007e00e7037400046578616d7371007e00e70174000c203d3d206e756c6c207c7c207371007e00e7037400046578616d7371007e00e70174000b203c2030203f2030203a207371007e00e7037400046578616d7371007e00e7017400012970707071007e00e070707074000373756d7071007e00ec7400116a6176612e6c616e672e496e7465676572707e72003c6e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e5768656e5265736f757263654d697373696e6754797065456e756d00000000000000001200007871007e001d7400044e554c4c7371007e00250000c54600007571007e0030000000047371007e00327400007400086c6173744e616d657371007e00357070707400106a6176612e6c616e672e537472696e67707371007e003274000074000966697273744e616d657371007e00357070707400106a6176612e6c616e672e537472696e67707371007e003274000074000a7365636f6e644e616d657371007e00357070707400106a6176612e6c616e672e537472696e67707371007e00327400007400086973417574686f727371007e00357070707400116a6176612e6c616e672e426f6f6c65616e70707074000f5465616368657273446174615365747571007e0054000000137371007e00560101707071007e0058707371007e003570707071007e005a707371007e00560101707071007e005c707371007e003570707071007e005e707371007e00560101707071007e0060707371007e003570707071007e0062707371007e00560101707071007e0064707371007e003570707071007e0066707371007e00560101707071007e0068707371007e003570707071007e006a707371007e00560101707071007e006c707371007e003570707071007e0038707371007e00560101707071007e006f707371007e003570707071007e0071707371007e00560101707071007e0073707371007e003570707071007e0075707371007e00560101707071007e0077707371007e003570707071007e0079707371007e00560101707071007e007b707371007e003570707071007e007d707371007e00560101707071007e007f707371007e003570707071007e0081707371007e00560101707071007e0083707371007e003570707071007e0085707371007e00560101707071007e0087707371007e003570707071007e0089707371007e00560101707071007e008b707371007e003570707071007e008d707371007e00560101707071007e008f707371007e003570707071007e0091707371007e00560101707071007e0093707371007e003570707071007e0095707371007e00560101707071007e0097707371007e003570707071007e0099707371007e00560101707071007e009b707371007e003570707071007e009d707371007e00560100707074000c6469736369706c696e654964707371007e00357070707400106a6176612e6c616e672e537472696e67707371007e00357070707371007e00b37571007e00b6000000037371007e00b8017400da73656c65637420742e6c6173744e616d652c20742e66697273744e616d652c20742e7365636f6e644e616d652c20742e6964203d20642e617574686f724964206173206973417574686f720a66726f6d0a202020206469736369706c696e657320640a202020206a6f696e206469736369706c696e65735f7465616368657273206474206f6e2064742e6469736369706c696e654964203d20642e69640a202020206a6f696e2074656163686572732074206f6e20742e6964203d2064742e7465616368657249640a77686572650a20202020642e6964203d2070707371007e00b80274000c6469736369706c696e65496470707371007e00b8017400170a6f72646572206279206973417574686f722064657363707074000373716c707070707371007e00d2b00e12f2566606669a9dd40a650341347571007e00d4000000057371007e00d6000077ee0000010071007e00dd707071007e00e070707371007e00e2000000007571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e7465676572283129707071007e00ea7071007e00ec71007e0038707371007e00d6000077ee0000010071007e00dd707071007e00e070707371007e00e2000000017571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e7465676572283129707071007e00f37071007e00f471007e0038707371007e00d6000077ee0000010071007e00f77371007e00e2000000027571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00e070707371007e00e2000000037571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e7465676572283029707071007e01017071007e00ec71007e0038707371007e00d6000077ee0000010071007e00f77371007e00e2000000047571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00e070707371007e00e2000000057571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e7465676572283029707071007e010b7071007e00f471007e0038707371007e00d6000077ee0000010071007e00f77371007e00e2000000067571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00e070707371007e00e2000000077571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e7465676572283029707071007e01157071007e011671007e00387071007e014670707372002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736553656374696f6e00000000000027d80200015b000562616e64737400255b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5242616e643b7870757200255b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5242616e643b95dd7eec8cca85350200007870000000017371007e00117371007e001a00000003770400000003737200376e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365436f6d706f6e656e74456c656d656e7400000000000027d80200024c0009636f6d706f6e656e747400314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f636f6d706f6e656e742f436f6d706f6e656e743b4c000c636f6d706f6e656e744b65797400344c6e65742f73662f6a61737065727265706f7274732f656e67696e652f636f6d706f6e656e742f436f6d706f6e656e744b65793b7872002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365456c656d656e7400000000000027d802001b49001950534555444f5f53455249414c5f56455253494f4e5f5549444900066865696768745a001769735072696e74496e466972737457686f6c6542616e645a001569735072696e74526570656174656456616c7565735a001a69735072696e745768656e44657461696c4f766572666c6f77735a0015697352656d6f76654c696e655768656e426c616e6b42000c706f736974696f6e5479706542000b7374726574636854797065490005776964746849000178490001794c00096261636b636f6c6f727400104c6a6176612f6177742f436f6c6f723b4c001464656661756c745374796c6550726f76696465727400344c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5244656661756c745374796c6550726f76696465723b4c000c656c656d656e7447726f757071007e00184c0009666f7265636f6c6f7271007e01c44c00036b657971007e00024c00046d6f646571007e00144c00096d6f646556616c756574002b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4d6f6465456e756d3b4c000b706172656e745374796c6571007e00074c0018706172656e745374796c654e616d655265666572656e636571007e00024c0011706f736974696f6e5479706556616c75657400334c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f506f736974696f6e54797065456e756d3b4c00137072696e745768656e45787072657373696f6e71007e00124c00157072696e745768656e47726f75704368616e67657371007e00d84c000d70726f706572746965734d617071007e00135b001370726f706572747945787072657373696f6e737400335b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5250726f706572747945787072657373696f6e3b4c0010737472657463685479706556616c75657400324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f5374726574636854797065456e756d3b4c00047575696471007e002c78700000c546000000780001000000000000022b00000000000000007071007e001071007e01be7070707070707e7200316e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e506f736974696f6e54797065456e756d00000000000000001200007871007e001d7400134649585f52454c41544956455f544f5f544f507371007e00e2000000117571007e00e5000000027371007e00e7037400086578616d547970657371007e00e70174001b2e657175616c7349676e6f7265436173652820226578616d22202970707070707e7200306e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e5374726574636854797065456e756d00000000000000001200007871007e001d74000a4e4f5f535452455443487371007e00d285cc8a2b7410289ec26d82ff17a041ed737200336e65742e73662e6a61737065727265706f7274732e636f6d706f6e656e74732e7461626c652e5374616e646172645461626c6500000000000027d80200034c0007636f6c756d6e7371007e00174c000a6461746173657452756e74002a4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a524461746173657452756e3b4c000e7768656e4e6f446174615479706574003f4c6e65742f73662f6a61737065727265706f7274732f636f6d706f6e656e74732f7461626c652f5768656e4e6f44617461547970655461626c65456e756d3b78707371007e001a00000006770400000006737200346e65742e73662e6a61737065727265706f7274732e636f6d706f6e656e74732e7461626c652e5374616e64617264436f6c756d6e00000000000027d80200014c000664657461696c74002c4c6e65742f73662f6a61737065727265706f7274732f636f6d706f6e656e74732f7461626c652f43656c6c3b787200386e65742e73662e6a61737065727265706f7274732e636f6d706f6e656e74732e7461626c652e5374616e6461726442617365436f6c756d6e00000000000027d802000b4c000c636f6c756d6e466f6f74657271007e01de4c000c636f6c756d6e48656164657271007e01de4c000c67726f7570466f6f7465727371007e00174c000c67726f75704865616465727371007e00174c00137072696e745768656e45787072657373696f6e71007e00124c000d70726f706572746965734d617071007e00134c001370726f706572747945787072657373696f6e7371007e00174c000b7461626c65466f6f74657271007e01de4c000b7461626c6548656164657271007e01de4c00047575696471007e002c4c000577696474687400134c6a6176612f6c616e672f496e74656765723b787070737200326e65742e73662e6a61737065727265706f7274732e636f6d706f6e656e74732e7461626c652e436f6d70696c656443656c6c00000000000027d80200074c0003626f787400274c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a524c696e65426f783b4c001464656661756c745374796c6550726f766964657271007e01c54c000668656967687471007e01e04c000d70726f706572746965734d617071007e00134c0007726f775370616e71007e01e04c00057374796c6571007e00074c00127374796c654e616d655265666572656e636571007e00027871007e00167371007e001a00000001770400000001737200316e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173655374617469635465787400000000000027d80200014c00047465787471007e0002787200326e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736554657874456c656d656e7400000000000027d802002649001950534555444f5f53455249414c5f56455253494f4e5f5549444c0006626f7264657271007e00144c000b626f72646572436f6c6f7271007e01c44c000c626f74746f6d426f7264657271007e00144c0011626f74746f6d426f72646572436f6c6f7271007e01c44c000d626f74746f6d50616464696e6771007e01e04c0008666f6e744e616d6571007e00024c0008666f6e7453697a6571007e01e04c0008666f6e7473697a657400114c6a6176612f6c616e672f466c6f61743b4c0013686f72697a6f6e74616c416c69676e6d656e7471007e00144c0018686f72697a6f6e74616c416c69676e6d656e7456616c75657400364c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f486f72697a6f6e74616c416c69676e456e756d3b4c00066973426f6c647400134c6a6176612f6c616e672f426f6f6c65616e3b4c000869734974616c696371007e01ea4c000d6973506466456d62656464656471007e01ea4c000f6973537472696b655468726f75676871007e01ea4c000c69735374796c65645465787471007e01ea4c000b6973556e6465726c696e6571007e01ea4c000a6c656674426f7264657271007e00144c000f6c656674426f72646572436f6c6f7271007e01c44c000b6c65667450616464696e6771007e01e04c00076c696e65426f7871007e01e34c000b6c696e6553706163696e6771007e00144c00106c696e6553706163696e6756616c75657400324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4c696e6553706163696e67456e756d3b4c00066d61726b757071007e00024c000770616464696e6771007e01e04c00097061726167726170687400294c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525061726167726170683b4c000b706466456e636f64696e6771007e00024c000b706466466f6e744e616d6571007e00024c000b7269676874426f7264657271007e00144c00107269676874426f72646572436f6c6f7271007e01c44c000c726967687450616464696e6771007e01e04c0008726f746174696f6e71007e00144c000d726f746174696f6e56616c756574002f4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f526f746174696f6e456e756d3b4c0009746f70426f7264657271007e00144c000e746f70426f72646572436f6c6f7271007e01c44c000a746f7050616464696e6771007e01e04c0011766572746963616c416c69676e6d656e7471007e00144c0016766572746963616c416c69676e6d656e7456616c75657400344c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f566572746963616c416c69676e456e756d3b7871007e01c30000c5460000006a0001000000000000001900000000000000007071007e001071007e01e470707070707071007e01cc7070707071007e01d57371007e00d2932f519523dbb97701f710338119483b0000c5467070707070740005417269616c7070707e7200346e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e486f72697a6f6e74616c416c69676e456e756d00000000000000001200007871007e001d74000643454e5445527070707070707070707372002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173654c696e65426f7800000000000027d802000b4c000d626f74746f6d50616464696e6771007e01e04c0009626f74746f6d50656e74002b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f626173652f4a52426f7850656e3b4c000c626f78436f6e7461696e657274002c4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52426f78436f6e7461696e65723b4c000b6c65667450616464696e6771007e01e04c00076c65667450656e71007e01f64c000770616464696e6771007e01e04c000370656e71007e01f64c000c726967687450616464696e6771007e01e04c0008726967687450656e71007e01f64c000a746f7050616464696e6771007e01e04c0006746f7050656e71007e01f6787070737200336e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365426f78426f74746f6d50656e00000000000027d80200007872002d6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365426f7850656e00000000000027d80200014c00076c696e65426f7871007e01e37872002a6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736550656e00000000000027d802000649001950534555444f5f53455249414c5f56455253494f4e5f5549444c00096c696e65436f6c6f7271007e01c44c00096c696e655374796c6571007e00144c000e6c696e655374796c6556616c75657400304c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4c696e655374796c65456e756d3b4c00096c696e65576964746871007e01e84c000c70656e436f6e7461696e657274002c4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5250656e436f6e7461696e65723b78700000c5467070707372000f6a6176612e6c616e672e466c6f6174daedc9a2db3cf0ec02000146000576616c7565787200106a6176612e6c616e672e4e756d62657286ac951d0b94e08b02000078703f00000071007e01f871007e01f871007e01ef70737200316e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365426f784c65667450656e00000000000027d80200007871007e01fa0000c5467070707371007e01ff3f00000071007e01f871007e01f8707371007e01fa0000c5467070707371007e01ff3f00000071007e01f871007e01f870737200326e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365426f78526967687450656e00000000000027d80200007871007e01fa0000c5467070707371007e01ff3f00000071007e01f871007e01f870737200306e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365426f78546f7050656e00000000000027d80200007871007e01fa0000c5467070707371007e01ff3f00000071007e01f871007e01f870707070737200306e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736550617261677261706800000000000027d802000a4c000f66697273744c696e65496e64656e7471007e01e04c000a6c656674496e64656e7471007e01e04c000b6c696e6553706163696e6771007e01eb4c000f6c696e6553706163696e6753697a6571007e01e84c0012706172616772617068436f6e7461696e65727400324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52506172616772617068436f6e7461696e65723b4c000b7269676874496e64656e7471007e01e04c000c73706163696e67416674657271007e01e04c000d73706163696e674265666f726571007e01e04c000c74616253746f70576964746871007e01e04c000874616253746f707371007e001778707070707071007e01ef707070707070707070707070707070707e7200326e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e566572746963616c416c69676e456e756d00000000000000001200007871007e001d7400064d4944444c45740003e2849678707371007e01f5707371007e01f90000c5467070707071007e021471007e021471007e01e4707371007e02020000c5467070707071007e021471007e0214707371007e01fa0000c5467070707071007e021471007e0214707371007e02070000c5467070707071007e021471007e0214707371007e020a0000c5467070707071007e021471007e021471007e0010737200116a6176612e6c616e672e496e746567657212e2a0a4f781873802000149000576616c75657871007e02000000006a707371007e021a0000000270707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d297b03ac590eb4ca7f04755ccb05b49387371007e021a000000197371007e01e27371007e001a00000001770400000001737200306e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365546578744669656c6400000000000027d802001549001950534555444f5f53455249414c5f56455253494f4e5f55494449000d626f6f6b6d61726b4c6576656c42000e6576616c756174696f6e54696d6542000f68797065726c696e6b54617267657442000d68797065726c696e6b547970655a0015697353747265746368576974684f766572666c6f774c0014616e63686f724e616d6545787072657373696f6e71007e00124c000f6576616c756174696f6e47726f757071007e00d84c00136576616c756174696f6e54696d6556616c75657400354c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4576616c756174696f6e54696d65456e756d3b4c000a65787072657373696f6e71007e00124c001968797065726c696e6b416e63686f7245787072657373696f6e71007e00124c001768797065726c696e6b5061676545787072657373696f6e71007e00125b001368797065726c696e6b506172616d65746572737400335b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5248797065726c696e6b506172616d657465723b4c001c68797065726c696e6b5265666572656e636545787072657373696f6e71007e00124c001a68797065726c696e6b546f6f6c74697045787072657373696f6e71007e00124c001768797065726c696e6b5768656e45787072657373696f6e71007e00124c000f6973426c616e6b5768656e4e756c6c71007e01ea4c000a6c696e6b54617267657471007e00024c00086c696e6b5479706571007e00024c00077061747465726e71007e00024c00117061747465726e45787072657373696f6e71007e00127871007e01e70000c5460000000e0001000000000000001900000000000000007071007e001071007e022270707070707071007e01cc7070707071007e01d57371007e00d2b7a91149a792bcf2aee9716f386b4b8c0000c5467070707070740005417269616c7070707e71007e01f274000552494748547070707070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e022c71007e022c71007e0227707371007e02020000c5467070707371007e01ff3f00000071007e022c71007e022c707371007e01fa0000c5467070707371007e01ff3f00000071007e022c71007e022c7371007e021a000000027371007e02070000c5467070707371007e01ff3f00000071007e022c71007e022c707371007e020a0000c5467070707371007e01ff3f00000071007e022c71007e022c707070707371007e020d7070707071007e02277070707070707070707070707070707071007e02110000c546000000000000000070707e7200336e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e4576616c756174696f6e54696d65456e756d00000000000000001200007871007e001d7400034e4f577371007e00e2000000097571007e00e5000000017371007e00e70474000c5245504f52545f434f554e547070707070707070707070707078707371007e01f5707371007e01f90000c5467070707071007e024071007e024071007e0222707371007e02020000c5467070707071007e024071007e0240707371007e01fa0000c5467070707071007e024071007e0240707371007e02070000c5467070707071007e024071007e0240707371007e020a0000c5467070707071007e024071007e024071007e00107371007e021a0000000e707371007e021a0000000170707371007e01dd707371007e01e27371007e001a000000017704000000017371007e01e60000c5460000006a000100000000000000dc00000000000000007071007e001071007e024970707070707071007e01cc7070707071007e01d57371007e00d2b3e83394f612f6d7c913e589603d4f320000c5467070707070740005417269616c707371007e01ff412000007071007e01f3737200116a6176612e6c616e672e426f6f6c65616ecd207280d59cfaee0200015a000576616c75657870007071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e025171007e025171007e024b707371007e02020000c5467070707371007e01ff3f00000071007e025171007e0251707371007e01fa0000c5467070707371007e01ff3f00000071007e025171007e0251707371007e02070000c5467070707371007e01ff3f00000071007e025171007e0251707371007e020a0000c5467070707371007e01ff3f00000071007e025171007e0251707070707371007e020d7070707071007e024b7070707070707070707070707070707071007e021174001ad0a42ed0982ed09e2e20d181d182d183d0b4d0b5d0bdd182d0b078707371007e01f5707371007e01f90000c5467070707071007e025e71007e025e71007e0249707371007e02020000c5467070707071007e025e71007e025e707371007e01fa0000c5467070707071007e025e71007e025e707371007e02070000c5467070707071007e025e71007e025e707371007e020a0000c5467070707071007e025e71007e025e71007e00107371007e021a0000006a707371007e021a0000000270707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d2b5aa8d20df2d26131e93cbaef0a343f97371007e021a000000dc7371007e01e27371007e001a000000017704000000017371007e02240000c5460000000e000100000000000000dc00000000000000007071007e001071007e026b70707070707071007e01cc7070707071007e01d57371007e00d283fa1f9de50541c7f42e4d52f87d471f0000c5467070707070740005417269616c707371007e01ff412000007070707071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e027171007e027171007e026d71007e02337371007e02020000c5467070707371007e01ff3f00000071007e027171007e0271707371007e01fa0000c5467070707371007e01ff3f00000071007e027171007e0271707371007e02070000c5467070707371007e01ff3f00000071007e027171007e0271707371007e020a0000c5467070707371007e01ff3f00000071007e027171007e0271707070707371007e020d7070707071007e026d7070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e20000000a7571007e00e5000000057371007e00e7037400084c6173744e616d657371007e00e701740009202b20222022202b207371007e00e70374000946697273744e616d657371007e00e701740009202b20222022202b207371007e00e70374000a5365636f6e644e616d657070707070707070707070707078707371007e01f5707371007e01f90000c5467070707071007e028971007e028971007e026b707371007e02020000c5467070707071007e028971007e0289707371007e01fa0000c5467070707071007e028971007e0289707371007e02070000c5467070707071007e028971007e0289707371007e020a0000c5467070707071007e028971007e028971007e00107371007e021a0000000e707371007e021a0000000170707371007e01dd707371007e01e27371007e001a000000017704000000017371007e01e60000c5460000006a0001000000000000001e00000000000000007071007e001071007e029270707070707071007e01cc7070707071007e01d57371007e00d2962333bb4c4de88e719f9343281b42c80000c5467070707070740005417269616c707371007e01ff412000007071007e01f371007e02507071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e029871007e029871007e0294707371007e02020000c5467070707371007e01ff3f00000071007e029871007e0298707371007e01fa0000c5467070707371007e01ff3f00000071007e029871007e0298707371007e02070000c5467070707371007e01ff3f00000071007e029871007e0298707371007e020a0000c5467070707371007e01ff3f00000071007e029871007e0298707070707371007e020d7070707071007e029470707070707070707070707e72002d6e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e526f746174696f6e456e756d00000000000000001200007871007e001d7400044c4546547070707071007e021174001fd098d182d0bed0b3d0bed0b2d18bd0b920d180d0b5d0b9d182d0b8d0bdd0b378707371007e01f5707371007e01f90000c5467070707071007e02a871007e02a871007e0292707371007e02020000c5467070707071007e02a871007e02a8707371007e01fa0000c5467070707071007e02a871007e02a8707371007e02070000c5467070707071007e02a871007e02a8707371007e020a0000c5467070707071007e02a871007e02a871007e00107371007e021a0000006a707371007e021a0000000270707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d2ae6c272f608777a6e5dbbadd5f0745537371007e021a0000001e7371007e01e27371007e001a000000017704000000017371007e02240000c5460000000e0001000000000000001e00000000000000007071007e001071007e02b570707070707071007e01cc7070707071007e01d57371007e00d28a21962c41a3e40c1d34a5ca9b1546080000c5467070707070740005417269616c70707071007e022a707071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e02ba71007e02ba71007e02b7707371007e02020000c5467070707371007e01ff3f00000071007e02ba71007e02ba707371007e01fa0000c5467070707071007e02ba71007e02ba71007e02337371007e02070000c5467070707371007e01ff3f00000071007e02ba71007e02ba707371007e020a0000c5467070707371007e01ff3f00000071007e02ba71007e02ba707070707371007e020d7070707071007e02b77070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e20000000b7571007e00e5000000067371007e00e70274000b697341667465724578616d7371007e00e70174000f203d3d20223122203f0a20202020287371007e00e70474000373756d7371007e00e70174000e203d3d2030203f20222d22203a207371007e00e70474000373756d7371007e00e70174000a290a3a0a202020202222707070707070707071007e02507070707078707371007e01f5707371007e01f90000c5467070707071007e02d371007e02d371007e02b5707371007e02020000c5467070707071007e02d371007e02d3707371007e01fa0000c5467070707071007e02d371007e02d3707371007e02070000c5467070707071007e02d371007e02d3707371007e020a0000c5467070707071007e02d371007e02d371007e00107371007e021a0000000e707371007e021a0000000170707371007e01dd707371007e01e27371007e001a000000017704000000017371007e01e60000c5460000006a0001000000000000001e00000000000000007071007e001071007e02dc70707070707071007e01cc7070707071007e01d57371007e00d29b1aa3476c8f66bb180f37c51f5944f90000c5467070707070740005417269616c707371007e01ff412000007071007e01f371007e02507071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e02e271007e02e271007e02de707371007e02020000c5467070707371007e01ff3f00000071007e02e271007e02e2707371007e01fa0000c5467070707371007e01ff3f00000071007e02e271007e02e2707371007e02070000c5467070707371007e01ff3f00000071007e02e271007e02e2707371007e020a0000c5467070707371007e01ff3f00000071007e02e271007e02e2707070707371007e020d7070707071007e02de707070707070707070707071007e02a57070707071007e021174001ed091d0b0d0bbd0bbd18b20d0b220d181d0b5d0bcd0b5d181d182d180d0b578707371007e01f5707371007e01f90000c5467070707071007e02ef71007e02ef71007e02dc707371007e02020000c5467070707071007e02ef71007e02ef707371007e01fa0000c5467070707071007e02ef71007e02ef707371007e02070000c5467070707071007e02ef71007e02ef707371007e020a0000c5467070707071007e02ef71007e02ef71007e00107371007e021a0000006a707371007e021a0000000270707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d2aeaad9a3864f56593cc320a5701f41237371007e021a0000001e7371007e01e27371007e001a000000017704000000017371007e02240000c5460000000e0001000000000000001e00000000000000007071007e001071007e02fc70707070707071007e01cc7070707071007e01d57371007e00d28f7a8ff5dd1e185f93fd1ea3c0d54b580000c5467070707070740005417269616c70707071007e022a7070707070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e030171007e030171007e02fe707371007e02020000c5467070707371007e01ff3f00000071007e030171007e0301707371007e01fa0000c5467070707071007e030171007e030171007e02337371007e02070000c5467070707371007e01ff3f00000071007e030171007e0301707371007e020a0000c5467070707371007e01ff3f00000071007e030171007e0301707070707371007e020d7070707071007e02fe7070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e20000000c7571007e00e5000000057371007e00e70374000c696e7465726d6564696174657371007e00e70174000c203d3d206e756c6c207c7c207371007e00e70374000c696e7465726d6564696174657371007e00e70174000e203d3d2030203f20222d22203a207371007e00e70374000c696e7465726d6564696174657070707070707070707070707078707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e031871007e031871007e02fc707371007e02020000c5467070707371007e01ff3f00000071007e031871007e0318707371007e01fa0000c5467070707371007e01ff3f00000071007e031871007e0318707371007e02070000c5467070707371007e01ff3f00000071007e031871007e0318707371007e020a0000c5467070707371007e01ff3f00000071007e031871007e031871007e00107371007e021a0000000e707371007e021a0000000170707371007e01dd707371007e01e27371007e001a000000017704000000017371007e01e60000c5460000006a0001000000000000001e00000000000000007071007e001071007e032670707070707071007e01cc7070707071007e01d57371007e00d29b5c9e9811065c7ce831c2deaaf141ed0000c5467070707070740005417269616c707371007e01ff412000007071007e01f371007e02507071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e032c71007e032c71007e0328707371007e02020000c5467070707371007e01ff3f00000071007e032c71007e032c707371007e01fa0000c5467070707371007e01ff3f00000071007e032c71007e032c707371007e02070000c5467070707371007e01ff3f00000071007e032c71007e032c707371007e020a0000c5467070707371007e01ff3f00000071007e032c71007e032c707070707371007e020d7070707071007e0328707070707070707070707071007e02a57070707071007e021174001bd091d0bed0bdd183d181d0bdd18bd0b520d0b1d0b0d0bbd0bbd18b78707371007e01f5707371007e01f90000c5467070707071007e033971007e033971007e0326707371007e02020000c5467070707071007e033971007e0339707371007e01fa0000c5467070707071007e033971007e0339707371007e02070000c5467070707071007e033971007e0339707371007e020a0000c5467070707071007e033971007e033971007e00107371007e021a0000006a707371007e021a0000000270707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d2aed959a0569c5b0ac397742a654741bc7371007e021a0000001e7371007e01e27371007e001a000000017704000000017371007e02240000c5460000000e0001000000000000001e00000000000000007071007e001071007e034670707070707071007e01cc7070707071007e01d57371007e00d29822d9562c52768f46a81b6792e44adf0000c5467070707070740005417269616c70707071007e022a707071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e034b71007e034b71007e0348707371007e02020000c5467070707371007e01ff3f00000071007e034b71007e034b707371007e01fa0000c5467070707071007e034b71007e034b71007e02337371007e02070000c5467070707371007e01ff3f00000071007e034b71007e034b707371007e020a0000c5467070707371007e01ff3f00000071007e034b71007e034b707070707371007e020d7070707071007e03487070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e20000000d7571007e00e5000000057371007e00e703740005626f6e75737371007e00e70174000c203d3d206e756c6c207c7c207371007e00e703740005626f6e75737371007e00e70174000e203d3d2030203f20222d22203a207371007e00e703740005626f6e7573707070707070707071007e02507070707078707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e036271007e036271007e0346707371007e02020000c5467070707371007e01ff3f00000071007e036271007e0362707371007e01fa0000c5467070707371007e01ff3f00000071007e036271007e0362707371007e02070000c5467070707371007e01ff3f00000071007e036271007e0362707371007e020a0000c5467070707371007e01ff3f00000071007e036271007e036271007e00107371007e021a0000000e707371007e021a000000017070737200396e65742e73662e6a61737065727265706f7274732e636f6d706f6e656e74732e7461626c652e5374616e64617264436f6c756d6e47726f757000000000000027d80200014c00086368696c6472656e71007e00177871007e01df707371007e01e27371007e001a000000027704000000027371007e01e60000c5460000000f000100000000000000a500000000000000007071007e001071007e037170707070707071007e01cc7070707071007e01d57371007e00d2a2c4575041c1c95d07d68b92678c42d90000c5467070707070740005417269616c70707071007e01f37070707070707070707371007e01f5707371007e01f90000c5467070707071007e037671007e037671007e0373707371007e02020000c5467070707371007e01ff3f00000071007e037671007e0376707371007e01fa0000c5467070707071007e037671007e0376707371007e02070000c5467070707371007e01ff3f00000071007e037671007e0376707371007e020a0000c5467070707371007e01ff3f00000071007e037671007e0376707070707371007e020d7070707071007e037370707070707070707070707e71007e02a47400044e4f4e457070707071007e0211740019d094d0b0d182d0b020d18dd0bad0b7d0b0d0bcd0b5d0bdd0b07371007e01e60000c5460000000f000100000000000000a5000000000000000f7071007e001071007e037170707070707071007e01cc7070707071007e01d57371007e00d29a2ea95f968ec2f479f7397d636747840000c5467070707070740005417269616c70707071007e01f37070707070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e038671007e038671007e0383707371007e02020000c5467070707371007e01ff3f00000071007e038671007e0386707371007e01fa0000c5467070707071007e038671007e0386707371007e02070000c5467070707371007e01ff3f00000071007e038671007e0386707371007e020a0000c5467070707071007e038671007e0386707070707371007e020d7070707071007e0383707070707070707070707070707070707074000b5f5f5f5f5f5f5f5f5f5f5f78707371007e01f5707371007e01f90000c5467070707071007e039171007e039171007e0371707371007e02020000c5467070707071007e039171007e0391707371007e01fa0000c5467070707071007e039171007e0391707371007e02070000c5467070707071007e039171007e0391707371007e020a0000c5467070707071007e039171007e039171007e00107371007e021a0000001e707371007e021a0000000170707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d28268016f588abf63b4fc963786a54d5c7371007e021a000000a57371007e001a000000037704000000037371007e01dd707371007e01e27371007e001a000000017704000000017371007e01e60000c5460000004c0001000000000000001e00000000000000007071007e001071007e03a070707070707071007e01cc7070707071007e01d57371007e00d2b45a0bf03ac26bf85d49e25ae61b4aad0000c5467070707070740005417269616c70707071007e01f37070707070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e03a571007e03a571007e03a2707371007e02020000c5467070707371007e01ff3f00000071007e03a571007e03a5707371007e01fa0000c5467070707071007e03a571007e03a5707371007e02070000c5467070707371007e01ff3f00000071007e03a571007e03a5707371007e020a0000c5467070707371007e01ff3f00000071007e03a571007e03a5707070707371007e020d7070707071007e03a2707070707070707070707071007e02a57070707071007e021174000ad091d0b0d0bbd0bbd18b78707371007e01f5707371007e01f90000c5467070707071007e03b171007e03b171007e03a0707371007e02020000c5467070707071007e03b171007e03b1707371007e01fa0000c5467070707071007e03b171007e03b1707371007e02070000c5467070707071007e03b171007e03b1707371007e020a0000c5467070707071007e03b171007e03b171007e00107371007e021a0000004c707371007e021a0000000170707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d28c3502ba431899cc48f8bb742d064bbd7371007e021a0000001e7371007e01e27371007e001a000000017704000000017371007e02240000c5460000000e0001000000000000001e00000000000000007071007e001071007e03be70707070707071007e01cc7070707071007e01d57371007e00d28ec6fe09bab7c5b8dfcd22615156457e0000c5467070707070740005417269616c70707071007e022a707071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e03c371007e03c371007e03c0707371007e02020000c5467070707371007e01ff3f00000071007e03c371007e03c3707371007e01fa0000c5467070707071007e03c371007e03c371007e02337371007e02070000c5467070707371007e01ff3f00000071007e03c371007e03c3707371007e020a0000c5467070707371007e01ff3f00000071007e03c371007e03c3707070707371007e020d7070707071007e03c07070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e20000000e7571007e00e5000000087371007e00e70274000b697341667465724578616d7371007e00e70174000e203d3d20223122203f0a202020207371007e00e7037400046578616d7371007e00e70174000c203d3d206e756c6c207c7c207371007e00e7037400046578616d7371007e00e70174000d203c2030203f20222d22203a207371007e00e7037400046578616d7371007e00e7017400050a3a0a2222707070707070707071007e02507070707078707371007e01f5707371007e01f90000c5467070707071007e03e071007e03e071007e03be707371007e02020000c5467070707071007e03e071007e03e0707371007e01fa0000c5467070707071007e03e071007e03e0707371007e02070000c5467070707071007e03e071007e03e0707371007e020a0000c5467070707071007e03e071007e03e071007e00107371007e021a0000000e707371007e021a0000000170707371007e01dd707371007e01e27371007e001a000000017704000000017371007e01e60000c5460000004c0001000000000000002d00000000000000007071007e001071007e03e970707070707071007e01cc7070707071007e01d57371007e00d28b26e33c0be42e6ac0d53a87962549000000c5467070707070740005417269616c70707071007e01f37070707070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e03ee71007e03ee71007e03eb707371007e02020000c5467070707371007e01ff3f00000071007e03ee71007e03ee707371007e01fa0000c5467070707071007e03ee71007e03ee707371007e02070000c5467070707371007e01ff3f00000071007e03ee71007e03ee707371007e020a0000c5467070707371007e01ff3f00000071007e03ee71007e03ee707070707371007e020d7070707071007e03eb707070707070707070707071007e02a57070707071007e021174000cd09ed186d0b5d0bdd0bad0b078707371007e01f5707371007e01f90000c5467070707071007e03fa71007e03fa71007e03e9707371007e02020000c5467070707071007e03fa71007e03fa707371007e01fa0000c5467070707071007e03fa71007e03fa707371007e02070000c5467070707071007e03fa71007e03fa707371007e020a0000c5467070707071007e03fa71007e03fa71007e00107371007e021a0000004c707371007e021a0000000170707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d2a713ef9506015007cc0239a445b445747371007e021a0000002d7371007e01e27371007e001a000000017704000000017371007e02240000c5460000000e0001000000000000002d00000000000000007071007e001071007e040770707070707071007e01cc7070707071007e01d57371007e00d2abec07205c23f234e8307bfe03cc4b300000c5467070707070740005417269616c70707071007e01f3707071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e040c71007e040c71007e0409707371007e02020000c5467070707371007e01ff3f00000071007e040c71007e040c707371007e01fa0000c5467070707371007e01ff3f00000071007e040c71007e040c707371007e02070000c5467070707371007e01ff3f00000071007e040c71007e040c707371007e020a0000c5467070707371007e01ff3f00000071007e040c71007e040c707070707371007e020d7070707071007e04097070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e20000000f7571007e00e5000000017371007e00e7037400046d61726b707070707070707071007e02507070707078707371007e01f5707371007e01f90000c5467070707071007e041c71007e041c71007e0407707371007e02020000c5467070707071007e041c71007e041c707371007e01fa0000c5467070707071007e041c71007e041c707371007e02070000c5467070707071007e041c71007e041c707371007e020a0000c5467070707071007e041c71007e041c71007e00107371007e021a0000000e707371007e021a0000000170707371007e01dd707371007e01e27371007e001a000000017704000000017371007e01e60000c5460000004c0001000000000000005a00000000000000007071007e001071007e042570707070707071007e01cc7070707071007e01d57371007e00d29ddedc0a2f8133c655786299ec06444b0000c5467070707070740005417269616c70707071007e01f37070707070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e042a71007e042a71007e0427707371007e02020000c5467070707371007e01ff3f00000071007e042a71007e042a707371007e01fa0000c5467070707071007e042a71007e042a707371007e02070000c5467070707371007e01ff3f00000071007e042a71007e042a707371007e020a0000c5467070707371007e01ff3f00000071007e042a71007e042a707070707371007e020d7070707071007e0427707070707070707070707071007e03807070707071007e0211740027d09fd0bed0b4d0bfd0b8d181d18c20d18dd0bad0b7d0b0d0bcd0b5d0bdd0b0d182d0bed180d0b078707371007e01f5707371007e01f90000c5467070707071007e043671007e043671007e0425707371007e02020000c5467070707071007e043671007e0436707371007e01fa0000c5467070707071007e043671007e0436707371007e02070000c5467070707071007e043671007e0436707371007e020a0000c5467070707071007e043671007e043671007e00107371007e021a0000004c707371007e021a0000000170707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d288f98eb7d3ef0f416dbaca54a7f64cbb7371007e021a0000005a7371007e01e27371007e001a0000000077040000000078707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e044571007e044571007e0443707371007e02020000c5467070707371007e01ff3f00000071007e044571007e0445707371007e01fa0000c5467070707071007e044571007e0445707371007e02070000c5467070707371007e01ff3f00000071007e044571007e0445707371007e020a0000c5467070707371007e01ff3f00000071007e044571007e044571007e00107371007e021a0000000e707371007e021a0000000170707878737200316e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173654461746173657452756e00000000000027d80200084c0014636f6e6e656374696f6e45787072657373696f6e71007e00124c001464617461536f7572636545787072657373696f6e71007e00124c000b646174617365744e616d6571007e00025b000a706172616d65746572737400315b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5244617461736574506172616d657465723b4c0017706172616d65746572734d617045787072657373696f6e71007e00124c000d70726f706572746965734d617071007e00134c000c72657475726e56616c75657371007e00174c00047575696471007e002c78707371007e00e2000000127571007e00e5000000017371007e00e7027400115245504f52545f434f4e4e454354494f4e70707074000f53747564656e7473446174615365747572003a5b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736544617461736574506172616d657465723b2413b76c659575a5020000787000000005737200376e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736544617461736574506172616d6574657200000000000027d80200024c000a65787072657373696f6e71007e00124c00046e616d6571007e000278707371007e00e2000000137571007e00e5000000017371007e00e70274000c6469736369706c696e654964707074000864697363697049647371007e045b7371007e00e2000000147571007e00e5000000017371007e00e70274000767726f75704964707074000767726f757049647371007e045b7371007e00e2000000157571007e00e5000000017371007e00e70274000b697341667465724578616d707074000b697341667465724578616d7371007e045b7371007e00e2000000167571007e00e5000000017371007e00e7037400086578616d5479706570707400086578616d547970657371007e045b7371007e00e2000000177571007e00e5000000017371007e00e70274000573656d4964707074000573656d49647070707371007e00d280b752251d17a64cd5bad33202f24bdf7e72003d6e65742e73662e6a61737065727265706f7274732e636f6d706f6e656e74732e7461626c652e5768656e4e6f44617461547970655461626c65456e756d00000000000000001200007871007e001d740005424c414e4b737200326e65742e73662e6a61737065727265706f7274732e656e67696e652e636f6d706f6e656e742e436f6d706f6e656e744b657900000000000027d80200034c00046e616d6571007e00024c00096e616d65737061636571007e00024c000f6e616d65737061636550726566697871007e000278707400057461626c6574003d687474703a2f2f6a61737065727265706f7274732e736f75726365666f7267652e6e65742f6a61737065727265706f7274732f636f6d706f6e656e74737400026a727371007e01c00000c546000000780001000000000000022b00000000000000007071007e001071007e01be70707070707071007e01cc7371007e00e2000000187571007e00e5000000027371007e00e7037400086578616d547970657371007e00e70174001d2e657175616c7349676e6f726543617365282022637265646974222029707070707071007e01d57371007e00d2958acd9aa09bde3a20989b58838045a27371007e01d87371007e001a000000067704000000067371007e01dd707371007e01e27371007e001a000000017704000000017371007e01e60000c5460000006a0001000000000000001900000000000000007071007e001071007e048e70707070707071007e01cc7070707071007e01d57371007e00d2bdd10b6a7d39c3921fa00aa0110f43f90000c5467070707070740005417269616c70707071007e01f37070707070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e049371007e049371007e0490707371007e02020000c5467070707371007e01ff3f00000071007e049371007e0493707371007e01fa0000c5467070707371007e01ff3f00000071007e049371007e0493707371007e02070000c5467070707371007e01ff3f00000071007e049371007e0493707371007e020a0000c5467070707371007e01ff3f00000071007e049371007e0493707070707371007e020d7070707071007e04907070707070707070707070707070707071007e0211740003e2849678707371007e01f5707371007e01f90000c5467070707071007e04a071007e04a071007e048e707371007e02020000c5467070707071007e04a071007e04a0707371007e01fa0000c5467070707071007e04a071007e04a0707371007e02070000c5467070707071007e04a071007e04a0707371007e020a0000c5467070707071007e04a071007e04a071007e00107371007e021a0000006a707371007e021a0000000270707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d2bacf08107238611ea9f09e5ce35f4dbc7371007e021a000000197371007e01e27371007e001a000000017704000000017371007e02240000c5460000000e0001000000000000001900000000000000007071007e001071007e04ad70707070707071007e01cc7070707071007e01d57371007e00d2a8f9f66eaa6cf64f6679aa37b5354d690000c5467070707070740005417269616c70707071007e022a7070707070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e04b271007e04b271007e04af707371007e02020000c5467070707371007e01ff3f00000071007e04b271007e04b2707371007e01fa0000c5467070707371007e01ff3f00000071007e04b271007e04b271007e02337371007e02070000c5467070707371007e01ff3f00000071007e04b271007e04b2707371007e020a0000c5467070707371007e01ff3f00000071007e04b271007e04b2707070707371007e020d7070707071007e04af7070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e2000000107571007e00e5000000017371007e00e70474000c5245504f52545f434f554e547070707070707070707070707078707371007e01f5707371007e01f90000c5467070707071007e04c271007e04c271007e04ad707371007e02020000c5467070707071007e04c271007e04c2707371007e01fa0000c5467070707071007e04c271007e04c2707371007e02070000c5467070707071007e04c271007e04c2707371007e020a0000c5467070707071007e04c271007e04c271007e00107371007e021a0000000e707371007e021a0000000170707371007e01dd707371007e01e27371007e001a000000017704000000017371007e01e60000c5460000006a000100000000000000dc00000000000000007071007e001071007e04cb70707070707071007e01cc7070707071007e01d57371007e00d28f86c78421942a06aa092410a94248350000c5467070707070740005417269616c707371007e01ff412000007071007e01f371007e02507071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e04d171007e04d171007e04cd707371007e02020000c5467070707371007e01ff3f00000071007e04d171007e04d1707371007e01fa0000c5467070707371007e01ff3f00000071007e04d171007e04d1707371007e02070000c5467070707371007e01ff3f00000071007e04d171007e04d1707371007e020a0000c5467070707371007e01ff3f00000071007e04d171007e04d1707070707371007e020d7070707071007e04cd7070707070707070707070707070707071007e021174001ad0a42ed0982ed09e2e20d181d182d183d0b4d0b5d0bdd182d0b078707371007e01f5707371007e01f90000c5467070707071007e04de71007e04de71007e04cb707371007e02020000c5467070707071007e04de71007e04de707371007e01fa0000c5467070707071007e04de71007e04de707371007e02070000c5467070707071007e04de71007e04de707371007e020a0000c5467070707071007e04de71007e04de71007e00107371007e021a0000006a707371007e021a0000000270707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d2b18caad56225fd8cf88011bdff4949617371007e021a000000dc7371007e01e27371007e001a000000017704000000017371007e02240000c5460000000e000100000000000000dc00000000000000007071007e001071007e04eb70707070707071007e01cc7070707071007e01d57371007e00d2925a588fe03424f6e0d9c4da3eb34e520000c5467070707070740005417269616c707371007e01ff412000007070707071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e04f171007e04f171007e04ed71007e02337371007e02020000c5467070707371007e01ff3f00000071007e04f171007e04f1707371007e01fa0000c5467070707371007e01ff3f00000071007e04f171007e04f1707371007e02070000c5467070707371007e01ff3f00000071007e04f171007e04f1707371007e020a0000c5467070707371007e01ff3f00000071007e04f171007e04f1707070707371007e020d7070707071007e04ed7070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e2000000117571007e00e5000000057371007e00e7037400084c6173744e616d657371007e00e701740009202b20222022202b207371007e00e70374000946697273744e616d657371007e00e701740009202b20222022202b207371007e00e70374000a5365636f6e644e616d657070707070707070707070707078707371007e01f5707371007e01f90000c5467070707071007e050971007e050971007e04eb707371007e02020000c5467070707071007e050971007e0509707371007e01fa0000c5467070707071007e050971007e0509707371007e02070000c5467070707071007e050971007e0509707371007e020a0000c5467070707071007e050971007e050971007e00107371007e021a0000000e707371007e021a0000000170707371007e01dd707371007e01e27371007e001a000000017704000000017371007e01e60000c5460000006a0001000000000000001e00000000000000007071007e001071007e051270707070707071007e01cc7070707071007e01d57371007e00d2bf79712c8afe0c6559e5c7a8ded24feb0000c5467070707070740005417269616c707371007e01ff412000007071007e01f371007e02507071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e051871007e051871007e0514707371007e02020000c5467070707371007e01ff3f00000071007e051871007e0518707371007e01fa0000c5467070707371007e01ff3f00000071007e051871007e0518707371007e02070000c5467070707371007e01ff3f00000071007e051871007e0518707371007e020a0000c5467070707371007e01ff3f00000071007e051871007e0518707070707371007e020d7070707071007e0514707070707070707070707071007e02a57070707071007e021174001fd098d182d0bed0b3d0bed0b2d18bd0b920d180d0b5d0b9d182d0b8d0bdd0b378707371007e01f5707371007e01f90000c5467070707071007e052571007e052571007e0512707371007e02020000c5467070707071007e052571007e0525707371007e01fa0000c5467070707071007e052571007e0525707371007e02070000c5467070707071007e052571007e0525707371007e020a0000c5467070707071007e052571007e052571007e00107371007e021a0000006a707371007e021a0000000270707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d2b9ae3def4ce5579a2fcf27c3129544717371007e021a0000001e7371007e01e27371007e001a000000017704000000017371007e02240000c5460000000e0001000000000000001e00000000000000007071007e001071007e053270707070707071007e01cc7070707071007e01d57371007e00d29436626c0cf29a3c17f8e111e6c245a70000c5467070707070740005417269616c70707071007e022a707071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e053771007e053771007e0534707371007e02020000c5467070707371007e01ff3f00000071007e053771007e0537707371007e01fa0000c5467070707071007e053771007e053771007e02337371007e02070000c5467070707371007e01ff3f00000071007e053771007e0537707371007e020a0000c5467070707371007e01ff3f00000071007e053771007e0537707070707371007e020d7070707071007e05347070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e2000000127571007e00e5000000037371007e00e70474000373756d7371007e00e70174000e203d3d2030203f20222d22203a207371007e00e70474000373756d707070707070707071007e02507070707078707371007e01f5707371007e01f90000c5467070707071007e054a71007e054a71007e0532707371007e02020000c5467070707071007e054a71007e054a707371007e01fa0000c5467070707071007e054a71007e054a707371007e02070000c5467070707071007e054a71007e054a707371007e020a0000c5467070707071007e054a71007e054a71007e00107371007e021a0000000e707371007e021a0000000170707371007e01dd707371007e01e27371007e001a000000017704000000017371007e01e60000c5460000006a0001000000000000001e00000000000000007071007e001071007e055370707070707071007e01cc7070707071007e01d57371007e00d2ab2f646be34e8cf67a081007fe7443b10000c5467070707070740005417269616c707371007e01ff412000007071007e01f371007e02507071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e055971007e055971007e0555707371007e02020000c5467070707371007e01ff3f00000071007e055971007e0559707371007e01fa0000c5467070707371007e01ff3f00000071007e055971007e0559707371007e02070000c5467070707371007e01ff3f00000071007e055971007e0559707371007e020a0000c5467070707371007e01ff3f00000071007e055971007e0559707070707371007e020d7070707071007e0555707070707070707070707071007e02a57070707071007e021174001ed091d0b0d0bbd0bbd18b20d0b220d181d0b5d0bcd0b5d181d182d180d0b578707371007e01f5707371007e01f90000c5467070707071007e056671007e056671007e0553707371007e02020000c5467070707071007e056671007e0566707371007e01fa0000c5467070707071007e056671007e0566707371007e02070000c5467070707071007e056671007e0566707371007e020a0000c5467070707071007e056671007e056671007e00107371007e021a0000006a707371007e021a0000000270707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d2afca9005ddce46fb0bdd5ec922c746487371007e021a0000001e7371007e01e27371007e001a000000017704000000017371007e02240000c5460000000e0001000000000000001e00000000000000007071007e001071007e057370707070707071007e01cc7070707071007e01d57371007e00d2ae4c3f1e6bcd1adcb4b61a1ef940468b0000c5467070707070740005417269616c70707071007e022a7070707070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e057871007e057871007e0575707371007e02020000c5467070707371007e01ff3f00000071007e057871007e0578707371007e01fa0000c5467070707071007e057871007e057871007e02337371007e02070000c5467070707371007e01ff3f00000071007e057871007e0578707371007e020a0000c5467070707371007e01ff3f00000071007e057871007e0578707070707371007e020d7070707071007e05757070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e2000000137571007e00e5000000057371007e00e70374000c696e7465726d6564696174657371007e00e70174000c203d3d206e756c6c207c7c207371007e00e70374000c696e7465726d6564696174657371007e00e70174000e203d3d2030203f20222d22203a207371007e00e70374000c696e7465726d6564696174657070707070707070707070707078707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e058f71007e058f71007e0573707371007e02020000c5467070707371007e01ff3f00000071007e058f71007e058f707371007e01fa0000c5467070707371007e01ff3f00000071007e058f71007e058f707371007e02070000c5467070707371007e01ff3f00000071007e058f71007e058f707371007e020a0000c5467070707371007e01ff3f00000071007e058f71007e058f71007e00107371007e021a0000000e707371007e021a0000000170707371007e01dd707371007e01e27371007e001a000000017704000000017371007e01e60000c5460000006a0001000000000000001e00000000000000007071007e001071007e059d70707070707071007e01cc7070707071007e01d57371007e00d291c51e4b338685211805fab910914ff30000c5467070707070740005417269616c707371007e01ff412000007071007e01f371007e02507071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e05a371007e05a371007e059f707371007e02020000c5467070707371007e01ff3f00000071007e05a371007e05a3707371007e01fa0000c5467070707371007e01ff3f00000071007e05a371007e05a3707371007e02070000c5467070707371007e01ff3f00000071007e05a371007e05a3707371007e020a0000c5467070707371007e01ff3f00000071007e05a371007e05a3707070707371007e020d7070707071007e059f707070707070707070707071007e02a57070707071007e021174001bd091d0bed0bdd183d181d0bdd18bd0b520d0b1d0b0d0bbd0bbd18b78707371007e01f5707371007e01f90000c5467070707071007e05b071007e05b071007e059d707371007e02020000c5467070707071007e05b071007e05b0707371007e01fa0000c5467070707071007e05b071007e05b0707371007e02070000c5467070707071007e05b071007e05b0707371007e020a0000c5467070707071007e05b071007e05b071007e00107371007e021a0000006a707371007e021a0000000270707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d2bf28adcc2464a9e445e982de165d4dcb7371007e021a0000001e7371007e01e27371007e001a000000017704000000017371007e02240000c5460000000e0001000000000000001e00000000000000007071007e001071007e05bd70707070707071007e01cc7070707071007e01d57371007e00d2a4e803b0b6b63fa04dbbc040beb24d170000c5467070707070740005417269616c70707071007e022a707071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e05c271007e05c271007e05bf707371007e02020000c5467070707371007e01ff3f00000071007e05c271007e05c2707371007e01fa0000c5467070707071007e05c271007e05c271007e02337371007e02070000c5467070707371007e01ff3f00000071007e05c271007e05c2707371007e020a0000c5467070707371007e01ff3f00000071007e05c271007e05c2707070707371007e020d7070707071007e05bf7070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e2000000147571007e00e5000000057371007e00e703740005626f6e75737371007e00e70174000c203d3d206e756c6c207c7c207371007e00e703740005626f6e75737371007e00e70174000e203d3d2030203f20222d22203a207371007e00e703740005626f6e7573707070707070707071007e02507070707078707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e05d971007e05d971007e05bd707371007e02020000c5467070707371007e01ff3f00000071007e05d971007e05d9707371007e01fa0000c5467070707371007e01ff3f00000071007e05d971007e05d9707371007e02070000c5467070707371007e01ff3f00000071007e05d971007e05d9707371007e020a0000c5467070707371007e01ff3f00000071007e05d971007e05d971007e00107371007e021a0000000e707371007e021a0000000170707371007e036f707371007e01e27371007e001a000000027704000000027371007e01e60000c5460000000f0001000000000000008700000000000000007071007e001071007e05e770707070707071007e01cc7070707071007e01d57371007e00d29c96a111fb7565f69b143350ad0245980000c5467070707070740005417269616c70707071007e01f37070707070707070707371007e01f5707371007e01f90000c5467070707071007e05ec71007e05ec71007e05e9707371007e02020000c5467070707371007e01ff3f00000071007e05ec71007e05ec707371007e01fa0000c5467070707071007e05ec71007e05ec707371007e02070000c5467070707371007e01ff3f00000071007e05ec71007e05ec707371007e020a0000c5467070707371007e01ff3f00000071007e05ec71007e05ec707070707371007e020d7070707071007e05e9707070707070707070707071007e03807070707071007e0211740015d094d0b0d182d0b020d0b7d0b0d187d0b5d182d0b07371007e01e60000c5460000000f00010000000000000087000000000000000f7071007e001071007e05e770707070707071007e01cc7070707071007e01d57371007e00d2ad01425e14cd082b1bf709e1bb2043820000c5467070707070740005417269616c70707071007e01f37070707070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e05fa71007e05fa71007e05f7707371007e02020000c5467070707371007e01ff3f00000071007e05fa71007e05fa707371007e01fa0000c5467070707071007e05fa71007e05fa707371007e02070000c5467070707371007e01ff3f00000071007e05fa71007e05fa707371007e020a0000c5467070707071007e05fa71007e05fa707070707371007e020d7070707071007e05f7707070707070707070707070707070707074000b5f5f5f5f5f5f5f5f5f5f5f78707371007e01f5707371007e01f90000c5467070707071007e060571007e060571007e05e7707371007e02020000c5467070707071007e060571007e0605707371007e01fa0000c5467070707071007e060571007e0605707371007e02070000c5467070707071007e060571007e0605707371007e020a0000c5467070707071007e060571007e060571007e00107371007e021a0000001e707371007e021a0000000170707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d2bb8359294a31a5f6fa137a83f06540b07371007e021a000000877371007e001a000000027704000000027371007e01dd707371007e01e27371007e001a000000017704000000017371007e01e60000c5460000004c0001000000000000002d00000000000000007071007e001071007e061470707070707071007e01cc7070707071007e01d57371007e00d282420bf59bea5263e3c02a01a44640e00000c5467070707070740005417269616c70707071007e01f37070707070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e061971007e061971007e0616707371007e02020000c5467070707371007e01ff3f00000071007e061971007e0619707371007e01fa0000c5467070707071007e061971007e0619707371007e02070000c5467070707371007e01ff3f00000071007e061971007e0619707371007e020a0000c5467070707371007e01ff3f00000071007e061971007e0619707070707371007e020d7070707071007e0616707070707070707070707071007e02a57070707071007e021174000cd09ed186d0b5d0bdd0bad0b078707371007e01f5707371007e01f90000c5467070707071007e062571007e062571007e0614707371007e02020000c5467070707071007e062571007e0625707371007e01fa0000c5467070707071007e062571007e0625707371007e02070000c5467070707071007e062571007e0625707371007e020a0000c5467070707071007e062571007e062571007e00107371007e021a0000004c707371007e021a0000000170707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d2b7cfc59a3efceb1f989473cdbc444f687371007e021a0000002d7371007e01e27371007e001a000000017704000000017371007e02240000c5460000000e0001000000000000002d00000000000000007071007e001071007e063270707070707071007e01cc7070707071007e01d57371007e00d2926acfd324b1d81d123b29df2283452d0000c5467070707070740005417269616c70707071007e01f3707071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e063771007e063771007e0634707371007e02020000c5467070707371007e01ff3f00000071007e063771007e0637707371007e01fa0000c5467070707371007e01ff3f00000071007e063771007e0637707371007e02070000c5467070707371007e01ff3f00000071007e063771007e0637707371007e020a0000c5467070707371007e01ff3f00000071007e063771007e0637707070707371007e020d7070707071007e06347070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e2000000157571007e00e5000000017371007e00e7037400046d61726b707070707070707071007e02507070707078707371007e01f5707371007e01f90000c5467070707071007e064771007e064771007e0632707371007e02020000c5467070707071007e064771007e0647707371007e01fa0000c5467070707071007e064771007e0647707371007e02070000c5467070707071007e064771007e0647707371007e020a0000c5467070707071007e064771007e064771007e00107371007e021a0000000e707371007e021a0000000170707371007e01dd707371007e01e27371007e001a000000017704000000017371007e01e60000c5460000004c0001000000000000005a00000000000000007071007e001071007e065070707070707071007e01cc7070707071007e01d57371007e00d2a3e12268c8cadfe5188b6b10cb0742930000c5467070707070740005417269616c70707071007e01f37070707070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e065571007e065571007e0652707371007e02020000c5467070707371007e01ff3f00000071007e065571007e0655707371007e01fa0000c5467070707071007e065571007e0655707371007e02070000c5467070707371007e01ff3f00000071007e065571007e0655707371007e020a0000c5467070707371007e01ff3f00000071007e065571007e0655707070707371007e020d7070707071007e0652707070707070707070707071007e03807070707071007e0211740027d09fd0bed0b4d0bfd0b8d181d18c20d18dd0bad0b7d0b0d0bcd0b5d0bdd0b0d182d0bed180d0b078707371007e01f5707371007e01f90000c5467070707071007e066171007e066171007e0650707371007e02020000c5467070707071007e066171007e0661707371007e01fa0000c5467070707071007e066171007e0661707371007e02070000c5467070707071007e066171007e0661707371007e020a0000c5467070707071007e066171007e066171007e00107371007e021a0000004c707371007e021a0000000170707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d284efa0efe28271d5ddaab733b9f74b657371007e021a0000005a7371007e01e27371007e001a0000000077040000000078707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e067071007e067071007e066e707371007e02020000c5467070707371007e01ff3f00000071007e067071007e0670707371007e01fa0000c5467070707071007e067071007e0670707371007e02070000c5467070707371007e01ff3f00000071007e067071007e0670707371007e020a0000c5467070707371007e01ff3f00000071007e067071007e067071007e00107371007e021a0000000e707371007e021a00000001707078787371007e04517371007e00e2000000197571007e00e5000000017371007e00e7027400115245504f52545f434f4e4e454354494f4e70707074000f53747564656e7473446174615365747571007e0459000000057371007e045b7371007e00e20000001a7571007e00e5000000017371007e00e70274000c6469736369706c696e654964707074000864697363697049647371007e045b7371007e00e20000001b7571007e00e5000000017371007e00e70274000767726f75704964707074000767726f757049647371007e045b7371007e00e20000001c7571007e00e5000000017371007e00e70274000b697341667465724578616d707074000b697341667465724578616d7371007e045b7371007e00e20000001d7571007e00e5000000017371007e00e7037400086578616d5479706570707400086578616d547970657371007e045b7371007e00e20000001e7571007e00e5000000017371007e00e70274000573656d4964707074000573656d49647070707371007e00d28fed223b8dc3d75b0b489064879346e371007e047c7371007e047e71007e048071007e04817400026a727371007e01c00000c546000000780001000000000000022b00000000000000007071007e001071007e01be70707070707071007e01cc7371007e00e20000001f7571007e00e5000000027371007e00e7037400086578616d547970657371007e00e7017400242e657175616c7349676e6f72654361736528202267726164696e67637265646974222029707070707071007e01d57371007e00d29eccd1116352fbcc59d9f3dd5f2e423c7371007e01d87371007e001a000000067704000000067371007e01dd707371007e01e27371007e001a000000017704000000017371007e01e60000c5460000006a0001000000000000001900000000000000007071007e001071007e06af70707070707071007e01cc7070707071007e01d57371007e00d286a2d2cb91244049e7c91871edb146ba0000c5467070707070740005417269616c70707071007e01f37070707070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e06b471007e06b471007e06b1707371007e02020000c5467070707371007e01ff3f00000071007e06b471007e06b4707371007e01fa0000c5467070707371007e01ff3f00000071007e06b471007e06b4707371007e02070000c5467070707371007e01ff3f00000071007e06b471007e06b4707371007e020a0000c5467070707371007e01ff3f00000071007e06b471007e06b4707070707371007e020d7070707071007e06b17070707070707070707070707070707071007e0211740003e2849678707371007e01f5707371007e01f90000c5467070707071007e06c171007e06c171007e06af707371007e02020000c5467070707071007e06c171007e06c1707371007e01fa0000c5467070707071007e06c171007e06c1707371007e02070000c5467070707071007e06c171007e06c1707371007e020a0000c5467070707071007e06c171007e06c171007e00107371007e021a0000006a707371007e021a0000000270707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d28f9e9a0316cef191552af5c491a94f617371007e021a000000197371007e01e27371007e001a000000017704000000017371007e02240000c5460000000e0001000000000000001900000000000000007071007e001071007e06ce70707070707071007e01cc7070707071007e01d57371007e00d2809a0db291f09708e53d75cd81134bae0000c5467070707070740005417269616c70707071007e022a7070707070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e06d371007e06d371007e06d0707371007e02020000c5467070707371007e01ff3f00000071007e06d371007e06d3707371007e01fa0000c5467070707371007e01ff3f00000071007e06d371007e06d371007e02337371007e02070000c5467070707371007e01ff3f00000071007e06d371007e06d3707371007e020a0000c5467070707371007e01ff3f00000071007e06d371007e06d3707070707371007e020d7070707071007e06d07070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e2000000167571007e00e5000000017371007e00e70474000c5245504f52545f434f554e547070707070707070707070707078707371007e01f5707371007e01f90000c5467070707071007e06e371007e06e371007e06ce707371007e02020000c5467070707071007e06e371007e06e3707371007e01fa0000c5467070707071007e06e371007e06e3707371007e02070000c5467070707071007e06e371007e06e3707371007e020a0000c5467070707071007e06e371007e06e371007e00107371007e021a0000000e707371007e021a0000000170707371007e01dd707371007e01e27371007e001a000000017704000000017371007e01e60000c5460000006a000100000000000000dc00000000000000007071007e001071007e06ec70707070707071007e01cc7070707071007e01d57371007e00d28a8808e2a94ed8f49debe43391df49340000c5467070707070740005417269616c707371007e01ff412000007071007e01f371007e02507071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e06f271007e06f271007e06ee707371007e02020000c5467070707371007e01ff3f00000071007e06f271007e06f2707371007e01fa0000c5467070707371007e01ff3f00000071007e06f271007e06f2707371007e02070000c5467070707371007e01ff3f00000071007e06f271007e06f2707371007e020a0000c5467070707371007e01ff3f00000071007e06f271007e06f2707070707371007e020d7070707071007e06ee7070707070707070707070707070707071007e021174001ad0a42ed0982ed09e2e20d181d182d183d0b4d0b5d0bdd182d0b078707371007e01f5707371007e01f90000c5467070707071007e06ff71007e06ff71007e06ec707371007e02020000c5467070707071007e06ff71007e06ff707371007e01fa0000c5467070707071007e06ff71007e06ff707371007e02070000c5467070707071007e06ff71007e06ff707371007e020a0000c5467070707071007e06ff71007e06ff71007e00107371007e021a0000006a707371007e021a0000000270707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d280ba0b9c2f7f31ba51bf534bb7404bef7371007e021a000000dc7371007e01e27371007e001a000000017704000000017371007e02240000c5460000000e000100000000000000dc00000000000000007071007e001071007e070c70707070707071007e01cc7070707071007e01d57371007e00d2a6757c9004d45f1c20b8305268184c5a0000c5467070707070740005417269616c707371007e01ff412000007070707071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e071271007e071271007e070e71007e02337371007e02020000c5467070707371007e01ff3f00000071007e071271007e0712707371007e01fa0000c5467070707371007e01ff3f00000071007e071271007e0712707371007e02070000c5467070707371007e01ff3f00000071007e071271007e0712707371007e020a0000c5467070707371007e01ff3f00000071007e071271007e0712707070707371007e020d7070707071007e070e7070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e2000000177571007e00e5000000057371007e00e7037400084c6173744e616d657371007e00e701740009202b20222022202b207371007e00e70374000946697273744e616d657371007e00e701740009202b20222022202b207371007e00e70374000a5365636f6e644e616d657070707070707070707070707078707371007e01f5707371007e01f90000c5467070707071007e072a71007e072a71007e070c707371007e02020000c5467070707071007e072a71007e072a707371007e01fa0000c5467070707071007e072a71007e072a707371007e02070000c5467070707071007e072a71007e072a707371007e020a0000c5467070707071007e072a71007e072a71007e00107371007e021a0000000e707371007e021a0000000170707371007e01dd707371007e01e27371007e001a000000017704000000017371007e01e60000c5460000006a0001000000000000001e00000000000000007071007e001071007e073370707070707071007e01cc7070707071007e01d57371007e00d2b0c38b19e6ceccb9c6789c2f85ba4efa0000c5467070707070740005417269616c707371007e01ff412000007071007e01f371007e02507071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e073971007e073971007e0735707371007e02020000c5467070707371007e01ff3f00000071007e073971007e0739707371007e01fa0000c5467070707371007e01ff3f00000071007e073971007e0739707371007e02070000c5467070707371007e01ff3f00000071007e073971007e0739707371007e020a0000c5467070707371007e01ff3f00000071007e073971007e0739707070707371007e020d7070707071007e0735707070707070707070707071007e02a57070707071007e021174001fd098d182d0bed0b3d0bed0b2d18bd0b920d180d0b5d0b9d182d0b8d0bdd0b378707371007e01f5707371007e01f90000c5467070707071007e074671007e074671007e0733707371007e02020000c5467070707071007e074671007e0746707371007e01fa0000c5467070707071007e074671007e0746707371007e02070000c5467070707071007e074671007e0746707371007e020a0000c5467070707071007e074671007e074671007e00107371007e021a0000006a707371007e021a0000000270707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d2bd92fc23c56b0567ab73aef48b264f527371007e021a0000001e7371007e01e27371007e001a000000017704000000017371007e02240000c5460000000e0001000000000000001e00000000000000007071007e001071007e075370707070707071007e01cc7070707071007e01d57371007e00d2982647af56ebad3c3db69b1939c744ce0000c5467070707070740005417269616c70707071007e022a707071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e075871007e075871007e0755707371007e02020000c5467070707371007e01ff3f00000071007e075871007e0758707371007e01fa0000c5467070707071007e075871007e075871007e02337371007e02070000c5467070707371007e01ff3f00000071007e075871007e0758707371007e020a0000c5467070707371007e01ff3f00000071007e075871007e0758707070707371007e020d7070707071007e07557070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e2000000187571007e00e5000000037371007e00e70474000373756d7371007e00e70174000e203d3d2030203f20222d22203a207371007e00e70474000373756d707070707070707071007e02507070707078707371007e01f5707371007e01f90000c5467070707071007e076b71007e076b71007e0753707371007e02020000c5467070707071007e076b71007e076b707371007e01fa0000c5467070707071007e076b71007e076b707371007e02070000c5467070707071007e076b71007e076b707371007e020a0000c5467070707071007e076b71007e076b71007e00107371007e021a0000000e707371007e021a0000000170707371007e01dd707371007e01e27371007e001a000000017704000000017371007e01e60000c5460000006a0001000000000000001e00000000000000007071007e001071007e077470707070707071007e01cc7070707071007e01d57371007e00d2825abe41decacfe469d0029e37214b610000c5467070707070740005417269616c707371007e01ff412000007071007e01f371007e02507071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e077a71007e077a71007e0776707371007e02020000c5467070707371007e01ff3f00000071007e077a71007e077a707371007e01fa0000c5467070707371007e01ff3f00000071007e077a71007e077a707371007e02070000c5467070707371007e01ff3f00000071007e077a71007e077a707371007e020a0000c5467070707371007e01ff3f00000071007e077a71007e077a707070707371007e020d7070707071007e0776707070707070707070707071007e02a57070707071007e021174001ed091d0b0d0bbd0bbd18b20d0b220d181d0b5d0bcd0b5d181d182d180d0b578707371007e01f5707371007e01f90000c5467070707071007e078771007e078771007e0774707371007e02020000c5467070707071007e078771007e0787707371007e01fa0000c5467070707071007e078771007e0787707371007e02070000c5467070707071007e078771007e0787707371007e020a0000c5467070707071007e078771007e078771007e00107371007e021a0000006a707371007e021a0000000270707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d2a6b3acfdce1af7f8e3992ad5532f4a767371007e021a0000001e7371007e01e27371007e001a000000017704000000017371007e02240000c5460000000e0001000000000000001e00000000000000007071007e001071007e079470707070707071007e01cc7070707071007e01d57371007e00d28619312ea312eecd4b186469b4154d4a0000c5467070707070740005417269616c70707071007e022a7070707070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e079971007e079971007e0796707371007e02020000c5467070707371007e01ff3f00000071007e079971007e0799707371007e01fa0000c5467070707071007e079971007e079971007e02337371007e02070000c5467070707371007e01ff3f00000071007e079971007e0799707371007e020a0000c5467070707371007e01ff3f00000071007e079971007e0799707070707371007e020d7070707071007e07967070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e2000000197571007e00e5000000057371007e00e70374000c696e7465726d6564696174657371007e00e70174000c203d3d206e756c6c207c7c207371007e00e70374000c696e7465726d6564696174657371007e00e70174000e203d3d2030203f20222d22203a207371007e00e70374000c696e7465726d6564696174657070707070707070707070707078707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e07b071007e07b071007e0794707371007e02020000c5467070707371007e01ff3f00000071007e07b071007e07b0707371007e01fa0000c5467070707371007e01ff3f00000071007e07b071007e07b0707371007e02070000c5467070707371007e01ff3f00000071007e07b071007e07b0707371007e020a0000c5467070707371007e01ff3f00000071007e07b071007e07b071007e00107371007e021a0000000e707371007e021a0000000170707371007e01dd707371007e01e27371007e001a000000017704000000017371007e01e60000c5460000006a0001000000000000001e00000000000000007071007e001071007e07be70707070707071007e01cc7070707071007e01d57371007e00d2a37430e43966d9e3e423bd7e3eb24f470000c5467070707070740005417269616c707371007e01ff412000007071007e01f371007e02507071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e07c471007e07c471007e07c0707371007e02020000c5467070707371007e01ff3f00000071007e07c471007e07c4707371007e01fa0000c5467070707371007e01ff3f00000071007e07c471007e07c4707371007e02070000c5467070707371007e01ff3f00000071007e07c471007e07c4707371007e020a0000c5467070707371007e01ff3f00000071007e07c471007e07c4707070707371007e020d7070707071007e07c0707070707070707070707071007e02a57070707071007e021174001bd091d0bed0bdd183d181d0bdd18bd0b520d0b1d0b0d0bbd0bbd18b78707371007e01f5707371007e01f90000c5467070707071007e07d171007e07d171007e07be707371007e02020000c5467070707071007e07d171007e07d1707371007e01fa0000c5467070707071007e07d171007e07d1707371007e02070000c5467070707071007e07d171007e07d1707371007e020a0000c5467070707071007e07d171007e07d171007e00107371007e021a0000006a707371007e021a0000000270707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d2a554bf508fa373b2a8db34c9b0034e1f7371007e021a0000001e7371007e01e27371007e001a000000017704000000017371007e02240000c5460000000e0001000000000000001e00000000000000007071007e001071007e07de70707070707071007e01cc7070707071007e01d57371007e00d28ec48ef5c5e9f7e7a42670a5c2d4462b0000c5467070707070740005417269616c70707071007e022a707071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e07e371007e07e371007e07e0707371007e02020000c5467070707371007e01ff3f00000071007e07e371007e07e3707371007e01fa0000c5467070707071007e07e371007e07e371007e02337371007e02070000c5467070707371007e01ff3f00000071007e07e371007e07e3707371007e020a0000c5467070707371007e01ff3f00000071007e07e371007e07e3707070707371007e020d7070707071007e07e07070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e20000001a7571007e00e5000000057371007e00e703740005626f6e75737371007e00e70174000c203d3d206e756c6c207c7c207371007e00e703740005626f6e75737371007e00e70174000e203d3d2030203f20222d22203a207371007e00e703740005626f6e7573707070707070707071007e02507070707078707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e07fa71007e07fa71007e07de707371007e02020000c5467070707371007e01ff3f00000071007e07fa71007e07fa707371007e01fa0000c5467070707371007e01ff3f00000071007e07fa71007e07fa707371007e02070000c5467070707371007e01ff3f00000071007e07fa71007e07fa707371007e020a0000c5467070707371007e01ff3f00000071007e07fa71007e07fa71007e00107371007e021a0000000e707371007e021a0000000170707371007e036f707371007e01e27371007e001a000000027704000000027371007e01e60000c5460000000f0001000000000000008700000000000000007071007e001071007e080870707070707071007e01cc7070707071007e01d57371007e00d2817c314b3a6cece70a36f6f1ed0e4c3e0000c5467070707070740005417269616c70707071007e01f37070707070707070707371007e01f5707371007e01f90000c5467070707071007e080d71007e080d71007e080a707371007e02020000c5467070707371007e01ff3f00000071007e080d71007e080d707371007e01fa0000c5467070707071007e080d71007e080d707371007e02070000c5467070707371007e01ff3f00000071007e080d71007e080d707371007e020a0000c5467070707371007e01ff3f00000071007e080d71007e080d707070707371007e020d7070707071007e080a707070707070707070707071007e03807070707071007e0211740015d094d0b0d182d0b020d0b7d0b0d187d0b5d182d0b07371007e01e60000c5460000000f00010000000000000087000000000000000f7071007e001071007e080870707070707071007e01cc7070707071007e01d57371007e00d2973a520f0123805d3e821c47503c4e940000c5467070707070740005417269616c70707071007e01f37070707070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e081b71007e081b71007e0818707371007e02020000c5467070707371007e01ff3f00000071007e081b71007e081b707371007e01fa0000c5467070707071007e081b71007e081b707371007e02070000c5467070707371007e01ff3f00000071007e081b71007e081b707371007e020a0000c5467070707071007e081b71007e081b707070707371007e020d7070707071007e0818707070707070707070707070707070707074000b5f5f5f5f5f5f5f5f5f5f5f78707371007e01f5707371007e01f90000c5467070707071007e082671007e082671007e0808707371007e02020000c5467070707071007e082671007e0826707371007e01fa0000c5467070707071007e082671007e0826707371007e02070000c5467070707071007e082671007e0826707371007e020a0000c5467070707071007e082671007e082671007e00107371007e021a0000001e707371007e021a0000000170707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d293a5ea34fb8aced52037c6eb37bf44b47371007e021a000000877371007e001a000000027704000000027371007e01dd707371007e01e27371007e001a000000017704000000017371007e01e60000c5460000004c0001000000000000002d00000000000000007071007e001071007e083570707070707071007e01cc7070707071007e01d57371007e00d2b21106f5e9b9cc3239be34e30104421e0000c5467070707070740005417269616c70707071007e01f37070707070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e083a71007e083a71007e0837707371007e02020000c5467070707371007e01ff3f00000071007e083a71007e083a707371007e01fa0000c5467070707071007e083a71007e083a707371007e02070000c5467070707371007e01ff3f00000071007e083a71007e083a707371007e020a0000c5467070707371007e01ff3f00000071007e083a71007e083a707070707371007e020d7070707071007e0837707070707070707070707071007e02a57070707071007e021174000cd09ed186d0b5d0bdd0bad0b078707371007e01f5707371007e01f90000c5467070707071007e084671007e084671007e0835707371007e02020000c5467070707071007e084671007e0846707371007e01fa0000c5467070707071007e084671007e0846707371007e02070000c5467070707071007e084671007e0846707371007e020a0000c5467070707071007e084671007e084671007e00107371007e021a0000004c707371007e021a0000000170707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d2bb9409fd0bdedfa05457ec1bb2854dc17371007e021a0000002d7371007e01e27371007e001a000000017704000000017371007e02240000c5460000000e0001000000000000002d00000000000000007071007e001071007e085370707070707071007e01cc7070707071007e01d57371007e00d2833b8e01cc542137ebf09e7fc62242a60000c5467070707070740005417269616c70707071007e01f3707071007e02507070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e085871007e085871007e0855707371007e02020000c5467070707371007e01ff3f00000071007e085871007e0858707371007e01fa0000c5467070707371007e01ff3f00000071007e085871007e0858707371007e02070000c5467070707371007e01ff3f00000071007e085871007e0858707371007e020a0000c5467070707371007e01ff3f00000071007e085871007e0858707070707371007e020d7070707071007e08557070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e20000001b7571007e00e5000000017371007e00e7037400046d61726b707070707070707071007e02507070707078707371007e01f5707371007e01f90000c5467070707071007e086871007e086871007e0853707371007e02020000c5467070707071007e086871007e0868707371007e01fa0000c5467070707071007e086871007e0868707371007e02070000c5467070707071007e086871007e0868707371007e020a0000c5467070707071007e086871007e086871007e00107371007e021a0000000e707371007e021a0000000170707371007e01dd707371007e01e27371007e001a000000017704000000017371007e01e60000c5460000004c0001000000000000005a00000000000000007071007e001071007e087170707070707071007e01cc7070707071007e01d57371007e00d2b6f9282556a7ea135f3e7769268541de0000c5467070707070740005417269616c70707071007e01f37070707070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e087671007e087671007e0873707371007e02020000c5467070707371007e01ff3f00000071007e087671007e0876707371007e01fa0000c5467070707071007e087671007e0876707371007e02070000c5467070707371007e01ff3f00000071007e087671007e0876707371007e020a0000c5467070707371007e01ff3f00000071007e087671007e0876707070707371007e020d7070707071007e0873707070707070707070707071007e03807070707071007e0211740027d09fd0bed0b4d0bfd0b8d181d18c20d18dd0bad0b7d0b0d0bcd0b5d0bdd0b0d182d0bed180d0b078707371007e01f5707371007e01f90000c5467070707071007e088271007e088271007e0871707371007e02020000c5467070707071007e088271007e0882707371007e01fa0000c5467070707071007e088271007e0882707371007e02070000c5467070707071007e088271007e0882707371007e020a0000c5467070707071007e088271007e088271007e00107371007e021a0000004c707371007e021a0000000170707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00d28eaf0817c1d7cbe97e7052cf46544e8b7371007e021a0000005a7371007e01e27371007e001a0000000077040000000078707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e089171007e089171007e088f707371007e02020000c5467070707371007e01ff3f00000071007e089171007e0891707371007e01fa0000c5467070707071007e089171007e0891707371007e02070000c5467070707371007e01ff3f00000071007e089171007e0891707371007e020a0000c5467070707371007e01ff3f00000071007e089171007e089171007e00107371007e021a0000000e707371007e021a00000001707078787371007e04517371007e00e2000000207571007e00e5000000017371007e00e7027400115245504f52545f434f4e4e454354494f4e70707074000f53747564656e7473446174615365747571007e0459000000057371007e045b7371007e00e2000000217571007e00e5000000017371007e00e70274000c6469736369706c696e654964707074000864697363697049647371007e045b7371007e00e2000000227571007e00e5000000017371007e00e70274000767726f75704964707074000767726f757049647371007e045b7371007e00e2000000237571007e00e5000000017371007e00e70274000b697341667465724578616d707074000b697341667465724578616d7371007e045b7371007e00e2000000247571007e00e5000000017371007e00e7037400086578616d5479706570707400086578616d547970657371007e045b7371007e00e2000000257571007e00e5000000017371007e00e70274000573656d4964707074000573656d49647070707371007e00d2a74dcb605818b954f545cb2513c04abd71007e047c7371007e047e71007e048071007e04817400026a7278700000c546000000780170707071007e001e70707400046a617661707371007e00250000c54601007571007e0030000000097371007e0032707400087375626a4e616d657371007e00357070707400106a6176612e6c616e672e537472696e67707371007e003270740008737065634e616d657371007e00357070707400106a6176612e6c616e672e537472696e67707371007e00327074000b666163416262724e616d657371007e00357070707400106a6176612e6c616e672e537472696e67707371007e00327400007400086578616d547970657371007e00357070707400106a6176612e6c616e672e537472696e67707371007e00327074000773656d596561727371007e00357070707400116a6176612e6c616e672e496e7465676572707371007e00327074000673656d4e756d7371007e00357070707400116a6176612e6c616e672e496e7465676572707371007e003274000074000867726f75704e756d7371007e00357070707400116a6176612e6c616e672e496e7465676572707371007e00327074000867726164654e756d7371007e00357070707400116a6176612e6c616e672e496e7465676572707371007e00327400007400066465677265657371007e00357070707400106a6176612e6c616e672e537472696e6770707074000573686565747571007e0054000000187371007e00560101707071007e0058707371007e003570707071007e005a707371007e00560101707071007e005c707371007e003570707071007e005e707371007e00560101707071007e0060707371007e003570707071007e0062707371007e00560101707071007e0064707371007e003570707071007e0066707371007e00560101707071007e0068707371007e003570707071007e006a707371007e00560101707071007e006c707371007e003570707071007e0038707371007e00560101707071007e006f707371007e003570707071007e0071707371007e00560101707071007e0073707371007e003570707071007e0075707371007e00560101707071007e0077707371007e003570707071007e0079707371007e00560101707071007e007b707371007e003570707071007e007d707371007e00560101707071007e007f707371007e003570707071007e0081707371007e00560101707071007e0083707371007e003570707071007e0085707371007e00560101707071007e0087707371007e003570707071007e0089707371007e00560101707071007e008b707371007e003570707071007e008d707371007e00560101707071007e008f707371007e003570707071007e0091707371007e00560101707071007e0093707371007e003570707071007e0095707371007e00560101707071007e0097707371007e003570707071007e0099707371007e00560101707071007e009b707371007e003570707071007e009d707371007e0056010170707400125245504f52545f5649525455414c495a4552707371007e00357070707400296e65742e73662e6a61737065727265706f7274732e656e67696e652e4a525669727475616c697a6572707371007e00560101707074001449535f49474e4f52455f504147494e4154494f4e707371007e00357070707400116a6176612e6c616e672e426f6f6c65616e707371007e00560100707074000c6469736369706c696e654964707371007e00357070707400106a6176612e6c616e672e537472696e67707371007e00560100707074000767726f75704964707371007e00357070707400106a6176612e6c616e672e537472696e67707371007e00560100707074000573656d4964707371007e00357070707400106a6176612e6c616e672e537472696e67707371007e00560100707074000b697341667465724578616d707371007e00357070707400106a6176612e6c616e672e537472696e67707371007e0035707371007e001a0000000377040000000374000c697265706f72742e7a6f6f6d740009697265706f72742e78740009697265706f72742e7978737200116a6176612e7574696c2e486173684d61700507dac1c31660d103000246000a6c6f6164466163746f724900097468726573686f6c6478703f400000000000037708000000040000000371007e09317400013071007e092f740011312e32313030303030303030303030303171007e093074000130787371007e00b37571007e00b60000000a7371007e00b80174005b53454c4543540a202020202853454c4543542064697374696e63742067726f75704e756d2046524f4d2060766965775f6469736369706c696e65735f73747564656e747360205748455245206469736369706c696e656964203d2070707371007e00b80274000c6469736369706c696e65496470707371007e00b80174000f20616e642067726f75706964203d2070707371007e00b80274000767726f7570496470707371007e00b80174005f292061732067726f75704e756d2c0a2853454c4543542064697374696e637420737065634e616d652046524f4d2060766965775f6469736369706c696e65735f73747564656e747360205748455245206469736369706c696e656964203d2070707371007e00b80274000c6469736369706c696e65496470707371007e00b80174000f20616e642067726f75706964203d2070707371007e00b80274000767726f7570496470707371007e00b8017401002920617320737065634e616d652c0a76642e7375626a6563744e616d65206173207375626a4e616d652c2076642e666163756c74794162627220617320666163416262724e616d652c2076642e6578616d547970652c0a20202020732e796561722061732073656d596561722c20732e6e756d2061732073656d4e756d2c2076642e67726164654e756d2c2076642e6465677265650a46524f4d200a2020202060766965775f6469736369706c696e6573602076640a202020206a6f696e2073656d6573746572732073206f6e20732e6964203d2076642e73656d657374657249640a5748455245200a2020202076642e6469736369706c696e656964203d2070707371007e00b80274000c6469736369706c696e654964707074000373716c707070707371007e00d2bd38ba9176f6e22929f5a641facb47a87571007e00d4000000057371007e00d6000077ee0000010071007e00dd707071007e00e070707371007e00e2000000007571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e7465676572283129707071007e00ea7071007e00ec71007e0038707371007e00d6000077ee0000010071007e00dd707071007e00e070707371007e00e2000000017571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e7465676572283129707071007e00f37071007e00f471007e0038707371007e00d6000077ee0000010071007e00f77371007e00e2000000027571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00e070707371007e00e2000000037571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e7465676572283029707071007e01017071007e00ec71007e0038707371007e00d6000077ee0000010071007e00f77371007e00e2000000047571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00e070707371007e00e2000000057571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e7465676572283029707071007e010b7071007e00f471007e0038707371007e00d6000077ee0000010071007e00f77371007e00e2000000067571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00e070707371007e00e2000000077571007e00e5000000017371007e00e7017400186e6577206a6176612e6c616e672e496e7465676572283029707071007e01157071007e011671007e00387071007e014671007e08ef707e7200306e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e4f7269656e746174696f6e456e756d00000000000000001200007871007e001d740008504f52545241495470707e72002f6e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e5072696e744f72646572456e756d00000000000000001200007871007e001d740008564552544943414c7070707371007e00117371007e001a0000000b77040000000b7371007e01e60000c5460000001700010000000000000047000001e4000000007071007e001071007e097b70707070707071007e01cc7070707071007e01d57371007e00d28d28d7ac683543c93bebbf99c8ef47f50000c5467070707070740005417269616c70707071007e01f37070707070707070707371007e01f5707371007e01f90000c5467070707071007e098071007e098071007e097d707371007e02020000c5467070707071007e098071007e0980707371007e01fa0000c5467070707071007e098071007e0980707371007e02070000c5467070707071007e098071007e0980707371007e020a0000c5467070707071007e098071007e0980707070707371007e020d7070707071007e097d7070707070707070707070707070707071007e0211740026d0bed187d0bdd0b0d18f20d184d0bed180d0bcd0b020d0bed0b1d183d187d0b5d0bdd0b8d18f7371007e02240000c5460000001100010000000000000047000001e4000000177071007e001071007e097b70707070707071007e01cc7070707071007e01d57371007e00d293456b220f5fb715b04902db199848590000c5467070707070740005417269616c70707071007e01f37070707070707070707371007e01f5707371007e01f90000c5467070707071007e098b71007e098b71007e0988707371007e02020000c5467070707071007e098b71007e098b707371007e01fa0000c5467070707071007e098b71007e098b707371007e02070000c5467070707071007e098b71007e098b707371007e020a0000c5467070707071007e098b71007e098b707070707371007e020d7070707071007e09887070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e2000000087571007e00e5000000017371007e00e7017400146e6577206a6176612e7574696c2e446174652829707070707070707070707074000864642e4d4d2e7979707371007e02240000c546000000110001000000000000006400000000000000007071007e001071007e097b70707070707071007e01cc7070707071007e01d57371007e00d2a551891ebcdf38bcb856ccfc033f40830000c5467070707070740005417269616c7070707071007e025070707070707070707371007e01f5707371007e01f90000c5467070707071007e099a71007e099a71007e099771007e02337371007e02020000c5467070707371007e01ff3f00000071007e099a71007e099a707371007e01fa0000c5467070707071007e099a71007e099a707371007e02070000c5467070707371007e01ff3f00000071007e099a71007e099a707371007e020a0000c5467070707371007e01ff3f00000071007e099a71007e099a707070707371007e020d7070707071007e09977070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e2000000097571007e00e5000000047371007e00e7037400086578616d547970657371007e00e7017400372e657175616c7349676e6f72654361736528226578616d2229203f0a2020202022d18dd0bad0b7d0b0d0bcd0b5d0bd220a3a0a202020207371007e00e7037400086578616d547970657371007e00e7017400552e657175616c7349676e6f72654361736528226372656469742229203f0a202020202020202022d0b7d0b0d187d0b5d182220a202020203a0a202020202020202022d0b4d0b8d1842e20d0b7d0b0d187d0b5d18222707070707070707070707070707371007e02240000c546000000110001000000000000006400000000000000227071007e001071007e097b70707070707071007e01cc7070707071007e01d57371007e00d2b1b20905f4bff236ec22dda5f9e847060000c5467070707070740005417269616c7070707071007e025070707070707070707371007e01f5707371007e01f90000c5467070707071007e09b171007e09b171007e09ae71007e02337371007e02020000c5467070707371007e01ff3f00000071007e09b171007e09b1707371007e01fa0000c5467070707071007e09b171007e09b1707371007e02070000c5467070707371007e01ff3f00000071007e09b171007e09b1707371007e020a0000c5467070707071007e09b171007e09b1707070707371007e020d7070707071007e09ae7070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e20000000a7571007e00e5000000037371007e00e701740010537472696e672e76616c75654f6628287371007e00e70374000673656d4e756d7371007e00e70174004a203d3d2031203f2022d0bed181d0b5d0bdd0bdd0b8d0b922203a2022d0b2d0b5d181d0b5d0bdd0bdd0b8d0b92229292e636f6e636174282220d181d0b5d0bcd0b5d181d182d180202229707070707070707070707070707371007e02240000c546000000110001000000000000015f000000660000001b7071007e001071007e097b70707070707071007e01cc7070707071007e01d57371007e00d2b65014f13c00615a1dd9a1d6085842990000c5467070707070740005417269616c70707071007e01f37371007e024f0170707070707070707371007e01f5707371007e01f90000c5467070707071007e09c671007e09c671007e09c2707371007e02020000c5467070707071007e09c671007e09c6707371007e01fa0000c5467070707071007e09c671007e09c6707371007e02070000c5467070707071007e09c671007e09c6707371007e020a0000c5467070707071007e09c671007e09c6707070707371007e020d7070707071007e09c27070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e20000000b7571007e00e5000000017371007e00e7037400087375626a4e616d65707070707070707070707070707371007e02240000c546000000110001000000000000015f000000660000002c7071007e001071007e097b70707070707071007e01cc7070707071007e01d57371007e00d2bf7082d9eb6b60dc03111f1166a548020000c5467070707070740005417269616c70707071007e01f37070707070707070707371007e01f5707371007e01f90000c5467070707071007e09d471007e09d471007e09d1707371007e02020000c5467070707071007e09d471007e09d4707371007e01fa0000c5467070707071007e09d471007e09d4707371007e02070000c5467070707071007e09d471007e09d4707371007e020a0000c5467070707071007e09d471007e09d4707070707371007e020d7070707071007e09d17070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e20000000c7571007e00e5000000037371007e00e70174001f22d09dd0b0d0bfd1802e20d0bfd0bed0b4d0b32e3a20222e636f6e636174287371007e00e703740008737065634e616d657371007e00e70174000129707070707070707070707070707371007e02240000c546000000110001000000000000006400000000000000117071007e001071007e097b70707070707071007e01cc7070707071007e01d57371007e00d2af007f89936793dfb1696f875dfc493f0000c5467070707070740005417269616c7070707071007e025070707070707070707371007e01f5707371007e01f90000c5467070707071007e09e671007e09e671007e09e371007e02337371007e02020000c5467070707371007e01ff3f00000071007e09e671007e09e6707371007e01fa0000c5467070707071007e09e671007e09e6707371007e02070000c5467070707371007e01ff3f00000071007e09e671007e09e6707371007e020a0000c5467070707071007e09e671007e09e6707070707371007e020d7070707071007e09e37070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e20000000d7571007e00e5000000077371007e00e701740001287371007e00e7037400066465677265657371007e00e70174002f2e657175616c7349676e6f7265436173652820226d61737465722220293f22d0bc20223a2222292e636f6e636174287371007e00e70374000867726164654e756d7371007e00e7017400222e746f537472696e6728292e636f6e636174282220d0ba2022292e636f6e636174287371007e00e70374000867726f75704e756d7371007e00e70174001d2e746f537472696e672829292e636f6e636174282220d0b3d180222929707070707070707070707070707371007e01e60000c546000000110001000000000000005000000000000000447071007e001071007e097b70707070707071007e01cc7070707071007e01d57371007e00d291ca1268429a799ede1bda75993e481c0000c5467070707070740005417269616c707070707070707070707070707371007e01f5707371007e01f90000c5467070707071007e0a0271007e0a0271007e09ff707371007e02020000c5467070707071007e0a0271007e0a02707371007e01fa0000c5467070707071007e0a0271007e0a02707371007e02070000c5467070707071007e0a0271007e0a02707371007e020a0000c5467070707071007e0a0271007e0a02707070707371007e020d7070707071007e09ff7070707070707070707070707070707071007e021174001bd09fd180d0b5d0bfd0bed0b4d0b0d0b2d0b0d182d0b5d0bbd18c3a7371007e02240000c546000000110001000000000000006400000000000000337071007e001071007e097b70707070707071007e01cc7070707071007e01d57371007e00d28d06818e240f67c95511ddc7d8a942f00000c5467070707070740005417269616c707070707070707070707070707371007e01f5707371007e01f90000c5467070707371007e01ff3f00000071007e0a0d71007e0a0d71007e0a0a71007e02337371007e02020000c5467070707371007e01ff3f00000071007e0a0d71007e0a0d707371007e01fa0000c5467070707071007e0a0d71007e0a0d707371007e02070000c5467070707371007e01ff3f00000071007e0a0d71007e0a0d707371007e020a0000c5467070707071007e0a0d71007e0a0d707070707371007e020d7070707071007e0a0a7070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e20000000e7571007e00e5000000047371007e00e70374000773656d596561727371007e00e70174002c2e746f537472696e6728292e636f6e63617428222f22292e636f6e63617428286e657720496e7465676572287371007e00e70374000773656d596561727371007e00e701740035202b203129292e746f537472696e6728292e737562737472696e6728322c3429292e636f6e636174282220d183d1872ed0b32e2229707070707070707070707070707371007e01e60000c546000000110001000000000000015f000000660000000a7071007e001071007e097b70707070707071007e01cc7070707071007e01d57371007e00d288c7a18db611f614d29d783706fb48260000c5467070707070740005417269616c707371007e01ff414000007071007e01f371007e09c570707070707070707371007e01f5707371007e01f90000c5467070707071007e0a2571007e0a2571007e0a21707371007e02020000c5467070707071007e0a2571007e0a25707371007e01fa0000c5467070707071007e0a2571007e0a25707371007e02070000c5467070707071007e0a2571007e0a25707371007e020a0000c5467070707071007e0a2571007e0a25707070707371007e020d7070707071007e0a217070707070707070707070707070707071007e0211740054d092d0b5d0b4d0bed0bcd0bed181d182d18c20d183d187d0b5d182d0b020d180d0b5d0b9d182d0b8d0bdd0b3d0bed0b2d18bd18520d0b1d0b0d0bbd0bbd0bed0b220d181d182d183d0b4d0b5d0bdd182d0bed0b27371007e01c00000c54600000011000100000000000001db00000050000000447071007e001071007e097b70707070707071007e01cc707070707e71007e01d474001a52454c41544956455f544f5f54414c4c4553545f4f424a4543547371007e00d2bddadaa6994f65beccc6a7719af243b87372003a6e65742e73662e6a61737065727265706f7274732e636f6d706f6e656e74732e6c6973742e5374616e646172644c697374436f6d706f6e656e74000000000000000102000649001950534555444f5f53455249414c5f56455253494f4e5f5549444c0008636f6e74656e74737400334c6e65742f73662f6a61737065727265706f7274732f636f6d706f6e656e74732f6c6973742f4c697374436f6e74656e74733b4c000a6461746173657452756e71007e01d94c000b69676e6f7265576964746871007e01ea4c000a7072696e744f7264657271007e00144c000f7072696e744f7264657256616c756571007e000c78700000c546737200356e65742e73662e6a61737065727265706f7274732e636f6d706f6e656e74732e6c6973742e426173654c697374436f6e74656e747300000000000000010200024900066865696768744c0005776964746871007e01e07871007e00167371007e001a000000017704000000017371007e02240000c546000000110001000000000000006400000000000000007071007e001071007e0a3570707070707071007e01cc7070707071007e01d57371007e00d2a305a50d256180c6e741307b809a4b600000c5467070707070740005417269616c707070707070707070707070707371007e01f5707371007e01f90000c5467070707071007e0a3a71007e0a3a71007e0a37707371007e02020000c5467070707071007e0a3a71007e0a3a707371007e01fa0000c5467070707071007e0a3a71007e0a3a707371007e02070000c5467070707071007e0a3a71007e0a3a707371007e020a0000c5467070707071007e0a3a71007e0a3a707074000468746d6c707371007e020d7070707071007e0a377070707070707070707070707070707071007e02110000c5460000000000000000707071007e023a7371007e00e2000000087571007e00e50000001e7371007e00e7037400086973417574686f727371007e00e701740014203f0a20202020223c623e222e636f6e636174287371007e00e7037400086c6173744e616d657371007e00e70174001b292e636f6e63617428222022290a202020202e636f6e63617428287371007e00e70374000966697273744e616d657371007e00e70174000d20213d206e756c6c207c7c20217371007e00e70374000966697273744e616d657371007e00e70174000e2e6973456d707479282929203f207371007e00e70374000966697273744e616d657371007e00e7017400302e737562737472696e6728302c2031292e636f6e63617428222e2229203a202222290a202020202e636f6e63617428287371007e00e70374000a7365636f6e644e616d657371007e00e70174000d20213d206e756c6c207c7c20217371007e00e70374000a7365636f6e644e616d657371007e00e70174000e2e6973456d707479282929203f207371007e00e70374000a7365636f6e644e616d657371007e00e70174003d2e737562737472696e6728302c2031292e636f6e63617428222e2229203a202222290a202020202e636f6e63617428223c2f623e22290a3a0a202020207371007e00e7037400086c6173744e616d657371007e00e70174001a2e636f6e63617428222022290a202020202e636f6e63617428287371007e00e70374000966697273744e616d657371007e00e70174000d20213d206e756c6c207c7c20217371007e00e70374000966697273744e616d657371007e00e70174000e2e6973456d707479282929203f207371007e00e70374000966697273744e616d657371007e00e7017400302e737562737472696e6728302c2031292e636f6e63617428222e2229203a202222290a202020202e636f6e63617428287371007e00e70374000a7365636f6e644e616d657371007e00e70174000d20213d206e756c6c207c7c20217371007e00e70374000a7365636f6e644e616d657371007e00e70174000e2e6973456d707479282929203f207371007e00e70374000a7365636f6e644e616d657371007e00e7017400222e737562737472696e6728302c2031292e636f6e63617428222e2229203a20222229707070707070707070707070707870000000117371007e021a000000647371007e04517371007e00e20000000f7571007e00e5000000017371007e00e7027400115245504f52545f434f4e4e454354494f4e70707074000f5465616368657273446174615365747571007e0459000000017371007e045b7371007e00e2000000107571007e00e5000000017371007e00e70274000c6469736369706c696e654964707074000c6469736369706c696e6549647070707371007e00d281403dddd49cc7774e8741ad06c0423371007e0250707e71007e097874000a484f52495a4f4e54414c7371007e047e7400046c69737471007e04817400026a7278700000c546000000550170707071007e001e7e7200336e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e5768656e4e6f4461746154797065456e756d00000000000000001200007871007e001d7400084e4f5f5041474553737200366e65742e73662e6a61737065727265706f7274732e656e67696e652e64657369676e2e4a525265706f7274436f6d70696c654461746100000000000027d80200034c001363726f7373746162436f6d70696c654461746171007e00364c001264617461736574436f6d70696c654461746171007e00364c00166d61696e44617461736574436f6d70696c654461746171007e000178707371007e09323f4000000000001077080000001000000000787371007e09323f4000000000000c7708000000100000000271007e015e757200025b42acf317f8060854e0020000787000001718cafebabe0000002e00e301002a73686565745f5465616368657273446174615365745f313433343438313538303036345f36373933383707000101002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a524576616c7561746f72070003010017706172616d657465725f5245504f52545f4c4f43414c450100324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d657465723b010017706172616d657465725f4a41535045525f5245504f525401001a706172616d657465725f5245504f52545f54494d455f5a4f4e45010015706172616d657465725f534f52545f4649454c445301001e706172616d657465725f5245504f52545f46494c455f5245534f4c56455201001a706172616d657465725f5245504f52545f5343524950544c455401001f706172616d657465725f5245504f52545f504152414d45544552535f4d415001001b706172616d657465725f5245504f52545f434f4e4e454354494f4e010018706172616d657465725f5245504f52545f434f4e5445585401001d706172616d657465725f5245504f52545f434c4153535f4c4f41444552010024706172616d657465725f5245504f52545f55524c5f48414e444c45525f464143544f525901001c706172616d657465725f5245504f52545f444154415f534f55524345010010706172616d657465725f46494c544552010020706172616d657465725f4a41535045525f5245504f5254535f434f4e5445585401001f706172616d657465725f5245504f52545f464f524d41545f464143544f525901001a706172616d657465725f5245504f52545f4d41585f434f554e5401001a706172616d657465725f5245504f52545f54454d504c41544553010016706172616d657465725f6469736369706c696e654964010020706172616d657465725f5245504f52545f5245534f555243455f42554e444c4501000e6669656c645f6c6173744e616d6501002e4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c643b0100106669656c645f7365636f6e644e616d6501000f6669656c645f66697273744e616d6501000e6669656c645f6973417574686f720100147661726961626c655f504147455f4e554d4245520100314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c653b0100167661726961626c655f434f4c554d4e5f4e554d4245520100157661726961626c655f5245504f52545f434f554e540100137661726961626c655f504147455f434f554e540100157661726961626c655f434f4c554d4e5f434f554e540100063c696e69743e010003282956010004436f64650c002400250a000400270c0005000609000200290c00070006090002002b0c00080006090002002d0c00090006090002002f0c000a000609000200310c000b000609000200330c000c000609000200350c000d000609000200370c000e000609000200390c000f0006090002003b0c00100006090002003d0c00110006090002003f0c0012000609000200410c0013000609000200430c0014000609000200450c0015000609000200470c0016000609000200490c00170006090002004b0c00180006090002004d0c0019001a090002004f0c001b001a09000200510c001c001a09000200530c001d001a09000200550c001e001f09000200570c0020001f09000200590c0021001f090002005b0c0022001f090002005d0c0023001f090002005f01000f4c696e654e756d6265725461626c6501000e637573746f6d697a6564496e6974010030284c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b295601000a696e6974506172616d73010012284c6a6176612f7574696c2f4d61703b29560c006400650a0002006601000a696e69744669656c64730c006800650a00020069010008696e6974566172730c006b00650a0002006c01000d5245504f52545f4c4f43414c4508006e01000d6a6176612f7574696c2f4d6170070070010003676574010026284c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f4f626a6563743b0c007200730b007100740100306e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d6574657207007601000d4a41535045525f5245504f52540800780100105245504f52545f54494d455f5a4f4e4508007a01000b534f52545f4649454c445308007c0100145245504f52545f46494c455f5245534f4c56455208007e0100105245504f52545f5343524950544c45540800800100155245504f52545f504152414d45544552535f4d41500800820100115245504f52545f434f4e4e454354494f4e08008401000e5245504f52545f434f4e544558540800860100135245504f52545f434c4153535f4c4f4144455208008801001a5245504f52545f55524c5f48414e444c45525f464143544f525908008a0100125245504f52545f444154415f534f5552434508008c01000646494c54455208008e0100164a41535045525f5245504f5254535f434f4e544558540800900100155245504f52545f464f524d41545f464143544f52590800920100105245504f52545f4d41585f434f554e540800940100105245504f52545f54454d504c4154455308009601000c6469736369706c696e6549640800980100165245504f52545f5245534f555243455f42554e444c4508009a0100086c6173744e616d6508009c01002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c6407009e01000a7365636f6e644e616d650800a001000966697273744e616d650800a20100086973417574686f720800a401000b504147455f4e554d4245520800a601002f6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c650700a801000d434f4c554d4e5f4e554d4245520800aa01000c5245504f52545f434f554e540800ac01000a504147455f434f554e540800ae01000c434f4c554d4e5f434f554e540800b00100086576616c756174650100152849294c6a6176612f6c616e672f4f626a6563743b01000a457863657074696f6e730100136a6176612f6c616e672f5468726f7761626c650700b50100116a6176612f6c616e672f496e74656765720700b7010004284929560c002400b90a00b800ba01000867657456616c756501001428294c6a6176612f6c616e672f4f626a6563743b0c00bc00bd0a009f00be0100116a6176612f6c616e672f426f6f6c65616e0700c001000c626f6f6c65616e56616c756501000328295a0c00c200c30a00c100c40100033c623e0800c60100106a6176612f6c616e672f537472696e670700c8010006636f6e636174010026284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f537472696e673b0c00ca00cb0a00c900cc010001200800ce0100076973456d7074790c00d000c30a00c900d1010009737562737472696e67010016284949294c6a6176612f6c616e672f537472696e673b0c00d300d40a00c900d50100012e0800d70100000800d90100043c2f623e0800db01000b6576616c756174654f6c6401000b6765744f6c6456616c75650c00de00bd0a009f00df0100116576616c75617465457374696d6174656401000a536f7572636546696c650021000200040000001c00020005000600000002000700060000000200080006000000020009000600000002000a000600000002000b000600000002000c000600000002000d000600000002000e000600000002000f0006000000020010000600000002001100060000000200120006000000020013000600000002001400060000000200150006000000020016000600000002001700060000000200180006000000020019001a00000002001b001a00000002001c001a00000002001d001a00000002001e001f000000020020001f000000020021001f000000020022001f000000020023001f00000008000100240025000100260000011d00020001000000912ab700282a01b5002a2a01b5002c2a01b5002e2a01b500302a01b500322a01b500342a01b500362a01b500382a01b5003a2a01b5003c2a01b5003e2a01b500402a01b500422a01b500442a01b500462a01b500482a01b5004a2a01b5004c2a01b5004e2a01b500502a01b500522a01b500542a01b500562a01b500582a01b5005a2a01b5005c2a01b5005e2a01b50060b10000000100610000007a001e00000012000400190009001a000e001b0013001c0018001d001d001e0022001f00270020002c00210031002200360023003b00240040002500450026004a0027004f0028005400290059002a005e002b0063002c0068002d006d002e0072002f00770030007c00310081003200860033008b003400900012000100620063000100260000003400020004000000102a2bb700672a2cb7006a2a2db7006db10000000100610000001200040000004000050041000a0042000f004300020064006500010026000001bb00030002000001572a2b126fb900750200c00077c00077b5002a2a2b1279b900750200c00077c00077b5002c2a2b127bb900750200c00077c00077b5002e2a2b127db900750200c00077c00077b500302a2b127fb900750200c00077c00077b500322a2b1281b900750200c00077c00077b500342a2b1283b900750200c00077c00077b500362a2b1285b900750200c00077c00077b500382a2b1287b900750200c00077c00077b5003a2a2b1289b900750200c00077c00077b5003c2a2b128bb900750200c00077c00077b5003e2a2b128db900750200c00077c00077b500402a2b128fb900750200c00077c00077b500422a2b1291b900750200c00077c00077b500442a2b1293b900750200c00077c00077b500462a2b1295b900750200c00077c00077b500482a2b1297b900750200c00077c00077b5004a2a2b1299b900750200c00077c00077b5004c2a2b129bb900750200c00077c00077b5004eb10000000100610000005200140000004b0012004c0024004d0036004e0048004f005a0050006c0051007e00520090005300a2005400b4005500c6005600d8005700ea005800fc0059010e005a0120005b0132005c0144005d0156005e000200680065000100260000007100030002000000492a2b129db900750200c0009fc0009fb500502a2b12a1b900750200c0009fc0009fb500522a2b12a3b900750200c0009fc0009fb500542a2b12a5b900750200c0009fc0009fb50056b1000000010061000000160005000000660012006700240068003600690048006a0002006b00650001002600000087000300020000005b2a2b12a7b900750200c000a9c000a9b500582a2b12abb900750200c000a9c000a9b5005a2a2b12adb900750200c000a9c000a9b5005c2a2b12afb900750200c000a9c000a9b5005e2a2b12b1b900750200c000a9c000a9b50060b10000000100610000001a00060000007200120073002400740036007500480076005a0077000100b200b3000200b400000004000100b600260000023a00040003000001b6014d1baa000001b10000000000000008000000310000003d0000004900000055000000610000006d000000790000008500000091bb00b85904b700bb4da70177bb00b85904b700bb4da7016bbb00b85904b700bb4da7015fbb00b85903b700bb4da70153bb00b85904b700bb4da70147bb00b85903b700bb4da7013bbb00b85904b700bb4da7012fbb00b85903b700bb4da701232ab40056b600bfc000c1b600c599009112c72ab40050b600bfc000c9b600cd12cfb600cd2ab40054b600bfc000c9c700132ab40054b600bfc000c9b600d29a001a2ab40054b600bfc000c90304b600d612d8b600cda7000512dab600cd2ab40052b600bfc000c9c700132ab40052b600bfc000c9b600d29a001a2ab40052b600bfc000c90304b600d612d8b600cda7000512dab600cd12dcb600cda700842ab40050b600bfc000c912cfb600cd2ab40054b600bfc000c9c700132ab40054b600bfc000c9b600d29a001a2ab40054b600bfc000c90304b600d612d8b600cda7000512dab600cd2ab40052b600bfc000c9c700132ab40052b600bfc000c9b600d29a001a2ab40052b600bfc000c90304b600d612d8b600cda7000512dab600cd4d2cb000000001006100000072001c0000007f0002008100340085003d00860040008a0049008b004c008f00550090005800940061009500640099006d009a0070009e0079009f007c00a3008500a4008800a8009100a9009400ad00a400ae00b800af00f100b0012a00b1013200b3014100b4017a00b501b300ad01b400bd000100dd00b3000200b400000004000100b600260000023a00040003000001b6014d1baa000001b10000000000000008000000310000003d0000004900000055000000610000006d000000790000008500000091bb00b85904b700bb4da70177bb00b85904b700bb4da7016bbb00b85904b700bb4da7015fbb00b85903b700bb4da70153bb00b85904b700bb4da70147bb00b85903b700bb4da7013bbb00b85904b700bb4da7012fbb00b85903b700bb4da701232ab40056b600e0c000c1b600c599009112c72ab40050b600e0c000c9b600cd12cfb600cd2ab40054b600e0c000c9c700132ab40054b600e0c000c9b600d29a001a2ab40054b600e0c000c90304b600d612d8b600cda7000512dab600cd2ab40052b600e0c000c9c700132ab40052b600e0c000c9b600d29a001a2ab40052b600e0c000c90304b600d612d8b600cda7000512dab600cd12dcb600cda700842ab40050b600e0c000c912cfb600cd2ab40054b600e0c000c9c700132ab40054b600e0c000c9b600d29a001a2ab40054b600e0c000c90304b600d612d8b600cda7000512dab600cd2ab40052b600e0c000c9c700132ab40052b600e0c000c9b600d29a001a2ab40052b600e0c000c90304b600d612d8b600cda7000512dab600cd4d2cb000000001006100000072001c000000c6000200c8003400cc003d00cd004000d1004900d2004c00d6005500d7005800db006100dc006400e0006d00e1007000e5007900e6007c00ea008500eb008800ef009100f0009400f400a400f500b800f600f100f7012a00f8013200fa014100fb017a00fc01b300f401b40104000100e100b3000200b400000004000100b600260000023a00040003000001b6014d1baa000001b10000000000000008000000310000003d0000004900000055000000610000006d000000790000008500000091bb00b85904b700bb4da70177bb00b85904b700bb4da7016bbb00b85904b700bb4da7015fbb00b85903b700bb4da70153bb00b85904b700bb4da70147bb00b85903b700bb4da7013bbb00b85904b700bb4da7012fbb00b85903b700bb4da701232ab40056b600bfc000c1b600c599009112c72ab40050b600bfc000c9b600cd12cfb600cd2ab40054b600bfc000c9c700132ab40054b600bfc000c9b600d29a001a2ab40054b600bfc000c90304b600d612d8b600cda7000512dab600cd2ab40052b600bfc000c9c700132ab40052b600bfc000c9b600d29a001a2ab40052b600bfc000c90304b600d612d8b600cda7000512dab600cd12dcb600cda700842ab40050b600bfc000c912cfb600cd2ab40054b600bfc000c9c700132ab40054b600bfc000c9b600d29a001a2ab40054b600bfc000c90304b600d612d8b600cda7000512dab600cd2ab40052b600bfc000c9c700132ab40052b600bfc000c9b600d29a001a2ab40052b600bfc000c90304b600d612d8b600cda7000512dab600cd4d2cb000000001006100000072001c0000010d0002010f00340113003d01140040011800490119004c011d0055011e005801220061012300640127006d01280070012c0079012d007c01310085013200880136009101370094013b00a4013c00b8013d00f1013e012a013f0132014101410142017a014301b3013b01b4014b000100e200000002000171007e00537571007e0a9b00002486cafebabe0000002e011b01002a73686565745f53747564656e7473446174615365745f313433343438313538303036345f36373933383707000101002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a524576616c7561746f72070003010017706172616d657465725f5245504f52545f4c4f43414c450100324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d657465723b010017706172616d657465725f4a41535045525f5245504f525401001a706172616d657465725f5245504f52545f54494d455f5a4f4e45010015706172616d657465725f534f52545f4649454c445301001e706172616d657465725f5245504f52545f46494c455f5245534f4c56455201001a706172616d657465725f5245504f52545f5343524950544c455401001f706172616d657465725f5245504f52545f504152414d45544552535f4d4150010012706172616d657465725f646973636970496401001b706172616d657465725f5245504f52545f434f4e4e454354494f4e010018706172616d657465725f5245504f52545f434f4e5445585401001d706172616d657465725f5245504f52545f434c4153535f4c4f41444552010024706172616d657465725f5245504f52545f55524c5f48414e444c45525f464143544f525901001c706172616d657465725f5245504f52545f444154415f534f55524345010010706172616d657465725f46494c544552010011706172616d657465725f67726f75704964010020706172616d657465725f4a41535045525f5245504f5254535f434f4e5445585401001f706172616d657465725f5245504f52545f464f524d41545f464143544f525901001a706172616d657465725f5245504f52545f4d41585f434f554e5401000f706172616d657465725f73656d496401001a706172616d657465725f5245504f52545f54454d504c41544553010015706172616d657465725f697341667465724578616d010012706172616d657465725f6578616d54797065010020706172616d657465725f5245504f52545f5245534f555243455f42554e444c450100086669656c645f494401002e4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c643b01000f6669656c645f46697273744e616d6501000a6669656c645f6d61726b01000b6669656c645f626f6e75730100126669656c645f696e7465726d65646961746501000e6669656c645f4c6173744e616d6501000a6669656c645f6578616d0100106669656c645f5365636f6e644e616d650100147661726961626c655f504147455f4e554d4245520100314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c653b0100167661726961626c655f434f4c554d4e5f4e554d4245520100157661726961626c655f5245504f52545f434f554e540100137661726961626c655f504147455f434f554e540100157661726961626c655f434f4c554d4e5f434f554e5401000c7661726961626c655f73756d0100063c696e69743e010003282956010004436f64650c002d002e0a000400300c0005000609000200320c0007000609000200340c0008000609000200360c0009000609000200380c000a0006090002003a0c000b0006090002003c0c000c0006090002003e0c000d000609000200400c000e000609000200420c000f000609000200440c0010000609000200460c0011000609000200480c00120006090002004a0c00130006090002004c0c00140006090002004e0c0015000609000200500c0016000609000200520c0017000609000200540c0018000609000200560c0019000609000200580c001a0006090002005a0c001b0006090002005c0c001c0006090002005e0c001d001e09000200600c001f001e09000200620c0020001e09000200640c0021001e09000200660c0022001e09000200680c0023001e090002006a0c0024001e090002006c0c0025001e090002006e0c0026002709000200700c0028002709000200720c0029002709000200740c002a002709000200760c002b002709000200780c002c0027090002007a01000f4c696e654e756d6265725461626c6501000e637573746f6d697a6564496e6974010030284c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b295601000a696e6974506172616d73010012284c6a6176612f7574696c2f4d61703b29560c007f00800a0002008101000a696e69744669656c64730c008300800a00020084010008696e6974566172730c008600800a0002008701000d5245504f52545f4c4f43414c4508008901000d6a6176612f7574696c2f4d617007008b010003676574010026284c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f4f626a6563743b0c008d008e0b008c008f0100306e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d6574657207009101000d4a41535045525f5245504f52540800930100105245504f52545f54494d455f5a4f4e4508009501000b534f52545f4649454c44530800970100145245504f52545f46494c455f5245534f4c5645520800990100105245504f52545f5343524950544c455408009b0100155245504f52545f504152414d45544552535f4d415008009d010008646973636970496408009f0100115245504f52545f434f4e4e454354494f4e0800a101000e5245504f52545f434f4e544558540800a30100135245504f52545f434c4153535f4c4f414445520800a501001a5245504f52545f55524c5f48414e444c45525f464143544f52590800a70100125245504f52545f444154415f534f555243450800a901000646494c5445520800ab01000767726f757049640800ad0100164a41535045525f5245504f5254535f434f4e544558540800af0100155245504f52545f464f524d41545f464143544f52590800b10100105245504f52545f4d41585f434f554e540800b301000573656d49640800b50100105245504f52545f54454d504c415445530800b701000b697341667465724578616d0800b90100086578616d547970650800bb0100165245504f52545f5245534f555243455f42554e444c450800bd01000249440800bf01002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c640700c101000946697273744e616d650800c30100046d61726b0800c5010005626f6e75730800c701000c696e7465726d6564696174650800c90100084c6173744e616d650800cb0100046578616d0800cd01000a5365636f6e644e616d650800cf01000b504147455f4e554d4245520800d101002f6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c650700d301000d434f4c554d4e5f4e554d4245520800d501000c5245504f52545f434f554e540800d701000a504147455f434f554e540800d901000c434f4c554d4e5f434f554e540800db01000373756d0800dd0100086576616c756174650100152849294c6a6176612f6c616e672f4f626a6563743b01000a457863657074696f6e730100136a6176612f6c616e672f5468726f7761626c650700e20100116a6176612f6c616e672f496e74656765720700e4010004284929560c002d00e60a00e500e701000867657456616c756501001428294c6a6176612f6c616e672f4f626a6563743b0c00e900ea0a00c200eb010008696e7456616c75650100032829490c00ed00ee0a00e500ef01000776616c75654f660100162849294c6a6176612f6c616e672f496e74656765723b0c00f100f20a00e500f30a00d400eb0100166a6176612f6c616e672f537472696e674275666665720700f60100106a6176612f6c616e672f537472696e670700f8010026284c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f537472696e673b0c00f100fa0a00f900fb010015284c6a6176612f6c616e672f537472696e673b29560c002d00fd0a00f700fe01000120080100010006617070656e6401002c284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f537472696e674275666665723b0c010201030a00f70104010008746f537472696e6701001428294c6a6176612f6c616e672f537472696e673b0c010601070a00f701080a009200eb0100013108010b0100012d08010d01000008010f01000b6576616c756174654f6c6401000b6765744f6c6456616c75650c011200ea0a00c201130a00d401130100116576616c75617465457374696d61746564010011676574457374696d6174656456616c75650c011700ea0a00d4011801000a536f7572636546696c650021000200040000002500020005000600000002000700060000000200080006000000020009000600000002000a000600000002000b000600000002000c000600000002000d000600000002000e000600000002000f0006000000020010000600000002001100060000000200120006000000020013000600000002001400060000000200150006000000020016000600000002001700060000000200180006000000020019000600000002001a000600000002001b000600000002001c000600000002001d001e00000002001f001e000000020020001e000000020021001e000000020022001e000000020023001e000000020024001e000000020025001e00000002002600270000000200280027000000020029002700000002002a002700000002002b002700000002002c0027000000080001002d002e0001002f0000016e00020001000000be2ab700312a01b500332a01b500352a01b500372a01b500392a01b5003b2a01b5003d2a01b5003f2a01b500412a01b500432a01b500452a01b500472a01b500492a01b5004b2a01b5004d2a01b5004f2a01b500512a01b500532a01b500552a01b500572a01b500592a01b5005b2a01b5005d2a01b5005f2a01b500612a01b500632a01b500652a01b500672a01b500692a01b5006b2a01b5006d2a01b5006f2a01b500712a01b500732a01b500752a01b500772a01b500792a01b5007bb100000001007c0000009e002700000012000400190009001a000e001b0013001c0018001d001d001e0022001f00270020002c00210031002200360023003b00240040002500450026004a0027004f0028005400290059002a005e002b0063002c0068002d006d002e0072002f00770030007c00310081003200860033008b00340090003500950036009a0037009f003800a4003900a9003a00ae003b00b3003c00b8003d00bd00120001007d007e0001002f0000003400020004000000102a2bb700822a2cb700852a2db70088b100000001007c000000120004000000490005004a000a004b000f004c0002007f00800001002f00000213000300020000019f2a2b128ab900900200c00092c00092b500332a2b1294b900900200c00092c00092b500352a2b1296b900900200c00092c00092b500372a2b1298b900900200c00092c00092b500392a2b129ab900900200c00092c00092b5003b2a2b129cb900900200c00092c00092b5003d2a2b129eb900900200c00092c00092b5003f2a2b12a0b900900200c00092c00092b500412a2b12a2b900900200c00092c00092b500432a2b12a4b900900200c00092c00092b500452a2b12a6b900900200c00092c00092b500472a2b12a8b900900200c00092c00092b500492a2b12aab900900200c00092c00092b5004b2a2b12acb900900200c00092c00092b5004d2a2b12aeb900900200c00092c00092b5004f2a2b12b0b900900200c00092c00092b500512a2b12b2b900900200c00092c00092b500532a2b12b4b900900200c00092c00092b500552a2b12b6b900900200c00092c00092b500572a2b12b8b900900200c00092c00092b500592a2b12bab900900200c00092c00092b5005b2a2b12bcb900900200c00092c00092b5005d2a2b12beb900900200c00092c00092b5005fb100000001007c0000006200180000005400120055002400560036005700480058005a0059006c005a007e005b0090005c00a2005d00b4005e00c6005f00d8006000ea006100fc0062010e00630120006401320065014400660156006701680068017a0069018c006a019e006b0002008300800001002f000000c900030002000000912a2b12c0b900900200c000c2c000c2b500612a2b12c4b900900200c000c2c000c2b500632a2b12c6b900900200c000c2c000c2b500652a2b12c8b900900200c000c2c000c2b500672a2b12cab900900200c000c2c000c2b500692a2b12ccb900900200c000c2c000c2b5006b2a2b12ceb900900200c000c2c000c2b5006d2a2b12d0b900900200c000c2c000c2b5006fb100000001007c0000002600090000007300120074002400750036007600480077005a0078006c0079007e007a0090007b0002008600800001002f0000009d000300020000006d2a2b12d2b900900200c000d4c000d4b500712a2b12d6b900900200c000d4c000d4b500732a2b12d8b900900200c000d4c000d4b500752a2b12dab900900200c000d4c000d4b500772a2b12dcb900900200c000d4c000d4b500792a2b12deb900900200c000d4c000d4b5007bb100000001007c0000001e00070000008300120084002400850036008600480087005a0088006c0089000100df00e0000200e100000004000100e3002f0000059c0003000300000478014d1baa00000473000000000000001b0000007d0000008900000095000000a1000000ad000000b9000000c5000000d1000000dd000001700000017e000001bf000001f90000022a0000025b000002a2000002b0000002be000002ff00000323000003540000038500000393000003a1000003e2000004060000043700000468bb00e55904b700e84da703edbb00e55904b700e84da703e1bb00e55904b700e84da703d5bb00e55903b700e84da703c9bb00e55904b700e84da703bdbb00e55903b700e84da703b1bb00e55904b700e84da703a5bb00e55903b700e84da703992ab40069b600ecc000e5c600132ab40069b600ecc000e5b600f09c000703a700102ab40069b600ecc000e5b600f02ab40067b600ecc000e5c600132ab40067b600ecc000e5b600f09c000703a700102ab40067b600ecc000e5b600f0602ab4006db600ecc000e5c600132ab4006db600ecc000e5b600f09c000703a700102ab4006db600ecc000e5b600f060b800f44da703062ab40075b600f5c000e54da702f8bb00f7592ab4006bb600ecc000f9b800fcb700ff130101b601052ab40063b600ecc000f9b60105130101b601052ab4006fb600ecc000f9b60105b601094da702b72ab4005bb6010ac000f913010ca600262ab4007bb600f5c000e5b600f09a000913010ea700132ab4007bb600f5c000e5a700061301104da7027d2ab40069b600ecc000e5c600132ab40069b600ecc000e5b600f09a000913010ea7000d2ab40069b600ecc000e54da7024c2ab40067b600ecc000e5c600132ab40067b600ecc000e5b600f09a000913010ea7000d2ab40067b600ecc000e54da7021b2ab4005bb6010ac000f913010ca600332ab4006db600ecc000e5c600132ab4006db600ecc000e5b600f09c000913010ea700132ab4006db600ecc000e5a700061301104da701d42ab40065b600ecc000f94da701c62ab40075b600f5c000e54da701b8bb00f7592ab4006bb600ecc000f9b800fcb700ff130101b601052ab40063b600ecc000f9b60105130101b601052ab4006fb600ecc000f9b60105b601094da701772ab4007bb600f5c000e5b600f09a000913010ea7000d2ab4007bb600f5c000e54da701532ab40069b600ecc000e5c600132ab40069b600ecc000e5b600f09a000913010ea7000d2ab40069b600ecc000e54da701222ab40067b600ecc000e5c600132ab40067b600ecc000e5b600f09a000913010ea7000d2ab40067b600ecc000e54da700f12ab40065b600ecc000f94da700e32ab40075b600f5c000e54da700d5bb00f7592ab4006bb600ecc000f9b800fcb700ff130101b601052ab40063b600ecc000f9b60105130101b601052ab4006fb600ecc000f9b60105b601094da700942ab4007bb600f5c000e5b600f09a000913010ea7000d2ab4007bb600f5c000e54da700702ab40069b600ecc000e5c600132ab40069b600ecc000e5b600f09a000913010ea7000d2ab40069b600ecc000e54da7003f2ab40067b600ecc000e5c600132ab40067b600ecc000e5b600f09a000913010ea7000d2ab40067b600ecc000e54da7000e2ab40065b600ecc000f94d2cb000000001007c00000112004400000091000200930080009700890098008c009c0095009d009800a100a100a200a400a600ad00a700b000ab00b900ac00bc00b000c500b100c800b500d100b600d400ba00dd00bb00e000bf010e00c1013c00bf013d00c3016b00bf017000c4017300c8017e00c9018100cd01bf00ce01c200d201d200d301f500d501f800d201f900d601fc00da022a00db022d00df025b00e0025e00e4026e00e5029e00e702a100e402a200e802a500ec02b000ed02b300f102be00f202c100f602ff00f7030200fb032300fc032601000354010103570105038501060388010a0393010b0396010f03a1011003a4011403e2011503e501190406011a0409011e0437011f043a012304680124046b0128047601300001011100e0000200e100000004000100e3002f0000059c0003000300000478014d1baa00000473000000000000001b0000007d0000008900000095000000a1000000ad000000b9000000c5000000d1000000dd000001700000017e000001bf000001f90000022a0000025b000002a2000002b0000002be000002ff00000323000003540000038500000393000003a1000003e2000004060000043700000468bb00e55904b700e84da703edbb00e55904b700e84da703e1bb00e55904b700e84da703d5bb00e55903b700e84da703c9bb00e55904b700e84da703bdbb00e55903b700e84da703b1bb00e55904b700e84da703a5bb00e55903b700e84da703992ab40069b60114c000e5c600132ab40069b60114c000e5b600f09c000703a700102ab40069b60114c000e5b600f02ab40067b60114c000e5c600132ab40067b60114c000e5b600f09c000703a700102ab40067b60114c000e5b600f0602ab4006db60114c000e5c600132ab4006db60114c000e5b600f09c000703a700102ab4006db60114c000e5b600f060b800f44da703062ab40075b60115c000e54da702f8bb00f7592ab4006bb60114c000f9b800fcb700ff130101b601052ab40063b60114c000f9b60105130101b601052ab4006fb60114c000f9b60105b601094da702b72ab4005bb6010ac000f913010ca600262ab4007bb60115c000e5b600f09a000913010ea700132ab4007bb60115c000e5a700061301104da7027d2ab40069b60114c000e5c600132ab40069b60114c000e5b600f09a000913010ea7000d2ab40069b60114c000e54da7024c2ab40067b60114c000e5c600132ab40067b60114c000e5b600f09a000913010ea7000d2ab40067b60114c000e54da7021b2ab4005bb6010ac000f913010ca600332ab4006db60114c000e5c600132ab4006db60114c000e5b600f09c000913010ea700132ab4006db60114c000e5a700061301104da701d42ab40065b60114c000f94da701c62ab40075b60115c000e54da701b8bb00f7592ab4006bb60114c000f9b800fcb700ff130101b601052ab40063b60114c000f9b60105130101b601052ab4006fb60114c000f9b60105b601094da701772ab4007bb60115c000e5b600f09a000913010ea7000d2ab4007bb60115c000e54da701532ab40069b60114c000e5c600132ab40069b60114c000e5b600f09a000913010ea7000d2ab40069b60114c000e54da701222ab40067b60114c000e5c600132ab40067b60114c000e5b600f09a000913010ea7000d2ab40067b60114c000e54da700f12ab40065b60114c000f94da700e32ab40075b60115c000e54da700d5bb00f7592ab4006bb60114c000f9b800fcb700ff130101b601052ab40063b60114c000f9b60105130101b601052ab4006fb60114c000f9b60105b601094da700942ab4007bb60115c000e5b600f09a000913010ea7000d2ab4007bb60115c000e54da700702ab40069b60114c000e5c600132ab40069b60114c000e5b600f09a000913010ea7000d2ab40069b60114c000e54da7003f2ab40067b60114c000e5c600132ab40067b60114c000e5b600f09a000913010ea7000d2ab40067b60114c000e54da7000e2ab40065b60114c000f94d2cb000000001007c000001120044000001390002013b0080013f00890140008c0144009501450098014900a1014a00a4014e00ad014f00b0015300b9015400bc015800c5015900c8015d00d1015e00d4016200dd016300e00167010e0169013c0167013d016b016b01670170016c01730170017e01710181017501bf017601c2017a01d2017b01f5017d01f8017a01f9017e01fc0182022a0183022d0187025b0188025e018c026e018d029e018f02a1018c02a2019002a5019402b0019502b3019902be019a02c1019e02ff019f030201a3032301a4032601a8035401a9035701ad038501ae038801b2039301b3039601b703a101b803a401bc03e201bd03e501c1040601c2040901c6043701c7043a01cb046801cc046b01d0047601d80001011600e0000200e100000004000100e3002f0000059c0003000300000478014d1baa00000473000000000000001b0000007d0000008900000095000000a1000000ad000000b9000000c5000000d1000000dd000001700000017e000001bf000001f90000022a0000025b000002a2000002b0000002be000002ff00000323000003540000038500000393000003a1000003e2000004060000043700000468bb00e55904b700e84da703edbb00e55904b700e84da703e1bb00e55904b700e84da703d5bb00e55903b700e84da703c9bb00e55904b700e84da703bdbb00e55903b700e84da703b1bb00e55904b700e84da703a5bb00e55903b700e84da703992ab40069b600ecc000e5c600132ab40069b600ecc000e5b600f09c000703a700102ab40069b600ecc000e5b600f02ab40067b600ecc000e5c600132ab40067b600ecc000e5b600f09c000703a700102ab40067b600ecc000e5b600f0602ab4006db600ecc000e5c600132ab4006db600ecc000e5b600f09c000703a700102ab4006db600ecc000e5b600f060b800f44da703062ab40075b60119c000e54da702f8bb00f7592ab4006bb600ecc000f9b800fcb700ff130101b601052ab40063b600ecc000f9b60105130101b601052ab4006fb600ecc000f9b60105b601094da702b72ab4005bb6010ac000f913010ca600262ab4007bb60119c000e5b600f09a000913010ea700132ab4007bb60119c000e5a700061301104da7027d2ab40069b600ecc000e5c600132ab40069b600ecc000e5b600f09a000913010ea7000d2ab40069b600ecc000e54da7024c2ab40067b600ecc000e5c600132ab40067b600ecc000e5b600f09a000913010ea7000d2ab40067b600ecc000e54da7021b2ab4005bb6010ac000f913010ca600332ab4006db600ecc000e5c600132ab4006db600ecc000e5b600f09c000913010ea700132ab4006db600ecc000e5a700061301104da701d42ab40065b600ecc000f94da701c62ab40075b60119c000e54da701b8bb00f7592ab4006bb600ecc000f9b800fcb700ff130101b601052ab40063b600ecc000f9b60105130101b601052ab4006fb600ecc000f9b60105b601094da701772ab4007bb60119c000e5b600f09a000913010ea7000d2ab4007bb60119c000e54da701532ab40069b600ecc000e5c600132ab40069b600ecc000e5b600f09a000913010ea7000d2ab40069b600ecc000e54da701222ab40067b600ecc000e5c600132ab40067b600ecc000e5b600f09a000913010ea7000d2ab40067b600ecc000e54da700f12ab40065b600ecc000f94da700e32ab40075b60119c000e54da700d5bb00f7592ab4006bb600ecc000f9b800fcb700ff130101b601052ab40063b600ecc000f9b60105130101b601052ab4006fb600ecc000f9b60105b601094da700942ab4007bb60119c000e5b600f09a000913010ea7000d2ab4007bb60119c000e54da700702ab40069b600ecc000e5c600132ab40069b600ecc000e5b600f09a000913010ea7000d2ab40069b600ecc000e54da7003f2ab40067b600ecc000e5c600132ab40067b600ecc000e5b600f09a000913010ea7000d2ab40067b600ecc000e54da7000e2ab40065b600ecc000f94d2cb000000001007c000001120044000001e1000201e3008001e7008901e8008c01ec009501ed009801f100a101f200a401f600ad01f700b001fb00b901fc00bc020000c5020100c8020500d1020600d4020a00dd020b00e0020f010e0211013c020f013d0213016b020f0170021401730218017e02190181021d01bf021e01c2022201d2022301f5022501f8022201f9022601fc022a022a022b022d022f025b0230025e0234026e0235029e023702a1023402a2023802a5023c02b0023d02b3024102be024202c1024602ff02470302024b0323024c032602500354025103570255038502560388025a0393025b0396025f03a1026003a4026403e2026503e502690406026a0409026e0437026f043a027304680274046b0278047602800001011a000000020001787571007e0a9b000023f5cafebabe0000002e013f01001a73686565745f313433343438313538303036345f36373933383707000101002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a524576616c7561746f72070003010017706172616d657465725f5245504f52545f4c4f43414c450100324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d657465723b010017706172616d657465725f4a41535045525f5245504f525401001c706172616d657465725f5245504f52545f5649525455414c495a455201001a706172616d657465725f5245504f52545f54494d455f5a4f4e45010015706172616d657465725f534f52545f4649454c445301001e706172616d657465725f5245504f52545f46494c455f5245534f4c56455201001a706172616d657465725f5245504f52545f5343524950544c455401001f706172616d657465725f5245504f52545f504152414d45544552535f4d415001001b706172616d657465725f5245504f52545f434f4e4e454354494f4e010018706172616d657465725f5245504f52545f434f4e5445585401001d706172616d657465725f5245504f52545f434c4153535f4c4f41444552010024706172616d657465725f5245504f52545f55524c5f48414e444c45525f464143544f525901001c706172616d657465725f5245504f52545f444154415f534f5552434501001e706172616d657465725f49535f49474e4f52455f504147494e4154494f4e010010706172616d657465725f46494c544552010011706172616d657465725f67726f75704964010020706172616d657465725f4a41535045525f5245504f5254535f434f4e5445585401001f706172616d657465725f5245504f52545f464f524d41545f464143544f525901001a706172616d657465725f5245504f52545f4d41585f434f554e5401000f706172616d657465725f73656d496401001a706172616d657465725f5245504f52545f54454d504c41544553010015706172616d657465725f697341667465724578616d010016706172616d657465725f6469736369706c696e654964010020706172616d657465725f5245504f52545f5245534f555243455f42554e444c4501000c6669656c645f64656772656501002e4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c643b01000e6669656c645f737065634e616d6501000d6669656c645f73656d5965617201000e6669656c645f7375626a4e616d6501000e6669656c645f67726f75704e756d01000c6669656c645f73656d4e756d01000e6669656c645f6578616d5479706501000e6669656c645f67726164654e756d0100116669656c645f666163416262724e616d650100147661726961626c655f504147455f4e554d4245520100314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c653b0100167661726961626c655f434f4c554d4e5f4e554d4245520100157661726961626c655f5245504f52545f434f554e540100137661726961626c655f504147455f434f554e540100157661726961626c655f434f4c554d4e5f434f554e540100063c696e69743e010003282956010004436f64650c002e002f0a000400310c0005000609000200330c0007000609000200350c0008000609000200370c0009000609000200390c000a0006090002003b0c000b0006090002003d0c000c0006090002003f0c000d000609000200410c000e000609000200430c000f000609000200450c0010000609000200470c0011000609000200490c00120006090002004b0c00130006090002004d0c00140006090002004f0c0015000609000200510c0016000609000200530c0017000609000200550c0018000609000200570c0019000609000200590c001a0006090002005b0c001b0006090002005d0c001c0006090002005f0c001d000609000200610c001e001f09000200630c0020001f09000200650c0021001f09000200670c0022001f09000200690c0023001f090002006b0c0024001f090002006d0c0025001f090002006f0c0026001f09000200710c0027001f09000200730c0028002909000200750c002a002909000200770c002b002909000200790c002c0029090002007b0c002d0029090002007d01000f4c696e654e756d6265725461626c6501000e637573746f6d697a6564496e6974010030284c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b295601000a696e6974506172616d73010012284c6a6176612f7574696c2f4d61703b29560c008200830a0002008401000a696e69744669656c64730c008600830a00020087010008696e6974566172730c008900830a0002008a01000d5245504f52545f4c4f43414c4508008c01000d6a6176612f7574696c2f4d617007008e010003676574010026284c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f4f626a6563743b0c009000910b008f00920100306e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d6574657207009401000d4a41535045525f5245504f52540800960100125245504f52545f5649525455414c495a45520800980100105245504f52545f54494d455f5a4f4e4508009a01000b534f52545f4649454c445308009c0100145245504f52545f46494c455f5245534f4c56455208009e0100105245504f52545f5343524950544c45540800a00100155245504f52545f504152414d45544552535f4d41500800a20100115245504f52545f434f4e4e454354494f4e0800a401000e5245504f52545f434f4e544558540800a60100135245504f52545f434c4153535f4c4f414445520800a801001a5245504f52545f55524c5f48414e444c45525f464143544f52590800aa0100125245504f52545f444154415f534f555243450800ac01001449535f49474e4f52455f504147494e4154494f4e0800ae01000646494c5445520800b001000767726f757049640800b20100164a41535045525f5245504f5254535f434f4e544558540800b40100155245504f52545f464f524d41545f464143544f52590800b60100105245504f52545f4d41585f434f554e540800b801000573656d49640800ba0100105245504f52545f54454d504c415445530800bc01000b697341667465724578616d0800be01000c6469736369706c696e6549640800c00100165245504f52545f5245534f555243455f42554e444c450800c20100066465677265650800c401002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c640700c6010008737065634e616d650800c801000773656d596561720800ca0100087375626a4e616d650800cc01000867726f75704e756d0800ce01000673656d4e756d0800d00100086578616d547970650800d201000867726164654e756d0800d401000b666163416262724e616d650800d601000b504147455f4e554d4245520800d801002f6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c650700da01000d434f4c554d4e5f4e554d4245520800dc01000c5245504f52545f434f554e540800de01000a504147455f434f554e540800e001000c434f4c554d4e5f434f554e540800e20100086576616c756174650100152849294c6a6176612f6c616e672f4f626a6563743b01000a457863657074696f6e730100136a6176612f6c616e672f5468726f7761626c650700e70100116a6176612f6c616e672f496e74656765720700e9010004284929560c002e00eb0a00ea00ec01000e6a6176612f7574696c2f446174650700ee0a00ef003101000867657456616c756501001428294c6a6176612f6c616e672f4f626a6563743b0c00f100f20a00c700f30100106a6176612f6c616e672f537472696e670700f50100046578616d0800f7010010657175616c7349676e6f726543617365010015284c6a6176612f6c616e672f537472696e673b295a0c00f900fa0a00f600fb01000ed18dd0bad0b7d0b0d0bcd0b5d0bd0800fd0100066372656469740800ff01000ad0b7d0b0d187d0b5d182080101010012d0b4d0b8d1842e20d0b7d0b0d187d0b5d182080103010008696e7456616c75650100032829490c010501060a00ea010701000ed0bed181d0b5d0bdd0bdd0b8d0b9080109010010d0b2d0b5d181d0b5d0bdd0bdd0b8d0b908010b01000776616c75654f66010026284c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f537472696e673b0c010d010e0a00f6010f01001020d181d0b5d0bcd0b5d181d182d18020080111010006636f6e636174010026284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f537472696e673b0c011301140a00f60115010015d09dd0b0d0bfd1802e20d0bfd0bed0b4d0b32e3a200801170100066d6173746572080119010003d0bc2008011b01000008011d010008746f537472696e6701001428294c6a6176612f6c616e672f537472696e673b0c011f01200a00ea012101000420d0ba2008012301000520d0b3d1800801250100012f080127010009737562737472696e67010016284949294c6a6176612f6c616e672f537472696e673b0c0129012a0a00f6012b01000920d183d1872ed0b32e08012d0a009500f30100136a6176612f73716c2f436f6e6e656374696f6e0701300100116a6176612f6c616e672f426f6f6c65616e070132010016285a294c6a6176612f6c616e672f426f6f6c65616e3b0c010d01340a0133013501000d67726164696e6763726564697408013701000b6576616c756174654f6c6401000b6765744f6c6456616c75650c013a00f20a00c7013b0100116576616c75617465457374696d6174656401000a536f7572636546696c650021000200040000002600020005000600000002000700060000000200080006000000020009000600000002000a000600000002000b000600000002000c000600000002000d000600000002000e000600000002000f0006000000020010000600000002001100060000000200120006000000020013000600000002001400060000000200150006000000020016000600000002001700060000000200180006000000020019000600000002001a000600000002001b000600000002001c000600000002001d000600000002001e001f000000020020001f000000020021001f000000020022001f000000020023001f000000020024001f000000020025001f000000020026001f000000020027001f000000020028002900000002002a002900000002002b002900000002002c002900000002002d0029000000080001002e002f000100300000017700020001000000c32ab700322a01b500342a01b500362a01b500382a01b5003a2a01b5003c2a01b5003e2a01b500402a01b500422a01b500442a01b500462a01b500482a01b5004a2a01b5004c2a01b5004e2a01b500502a01b500522a01b500542a01b500562a01b500582a01b5005a2a01b5005c2a01b5005e2a01b500602a01b500622a01b500642a01b500662a01b500682a01b5006a2a01b5006c2a01b5006e2a01b500702a01b500722a01b500742a01b500762a01b500782a01b5007a2a01b5007c2a01b5007eb100000001007f000000a2002800000012000400190009001a000e001b0013001c0018001d001d001e0022001f00270020002c00210031002200360023003b00240040002500450026004a0027004f0028005400290059002a005e002b0063002c0068002d006d002e0072002f00770030007c00310081003200860033008b00340090003500950036009a0037009f003800a4003900a9003a00ae003b00b3003c00b8003d00bd003e00c20012000100800081000100300000003400020004000000102a2bb700852a2cb700882a2db7008bb100000001007f0000001200040000004a0005004b000a004c000f004d000200820083000100300000022900030002000001b12a2b128db900930200c00095c00095b500342a2b1297b900930200c00095c00095b500362a2b1299b900930200c00095c00095b500382a2b129bb900930200c00095c00095b5003a2a2b129db900930200c00095c00095b5003c2a2b129fb900930200c00095c00095b5003e2a2b12a1b900930200c00095c00095b500402a2b12a3b900930200c00095c00095b500422a2b12a5b900930200c00095c00095b500442a2b12a7b900930200c00095c00095b500462a2b12a9b900930200c00095c00095b500482a2b12abb900930200c00095c00095b5004a2a2b12adb900930200c00095c00095b5004c2a2b12afb900930200c00095c00095b5004e2a2b12b1b900930200c00095c00095b500502a2b12b3b900930200c00095c00095b500522a2b12b5b900930200c00095c00095b500542a2b12b7b900930200c00095c00095b500562a2b12b9b900930200c00095c00095b500582a2b12bbb900930200c00095c00095b5005a2a2b12bdb900930200c00095c00095b5005c2a2b12bfb900930200c00095c00095b5005e2a2b12c1b900930200c00095c00095b500602a2b12c3b900930200c00095c00095b50062b100000001007f0000006600190000005500120056002400570036005800480059005a005a006c005b007e005c0090005d00a2005e00b4005f00c6006000d8006100ea006200fc0063010e00640120006501320066014400670156006801680069017a006a018c006b019e006c01b0006d00020086008300010030000000df00030002000000a32a2b12c5b900930200c000c7c000c7b500642a2b12c9b900930200c000c7c000c7b500662a2b12cbb900930200c000c7c000c7b500682a2b12cdb900930200c000c7c000c7b5006a2a2b12cfb900930200c000c7c000c7b5006c2a2b12d1b900930200c000c7c000c7b5006e2a2b12d3b900930200c000c7c000c7b500702a2b12d5b900930200c000c7c000c7b500722a2b12d7b900930200c000c7c000c7b50074b100000001007f0000002a000a0000007500120076002400770036007800480079005a007a006c007b007e007c0090007d00a2007e0002008900830001003000000087000300020000005b2a2b12d9b900930200c000dbc000dbb500762a2b12ddb900930200c000dbc000dbb500782a2b12dfb900930200c000dbc000dbb5007a2a2b12e1b900930200c000dbc000dbb5007c2a2b12e3b900930200c000dbc000dbb5007eb100000001007f0000001a0006000000860012008700240088003600890048008a005a008b000100e400e5000200e600000004000100e80030000004d80005000300000378014d1baa000003730000000000000025000000a5000000b1000000bd000000c9000000d5000000e1000000ed000000f90000010500000110000001470000016e0000017c00000190000001dc0000021a00000228000002360000024c0000025a00000268000002760000028400000292000002a0000002b7000002c5000002d3000002e1000002ef000002fd0000030b00000322000003300000033e0000034c0000035a00000368bb00ea5904b700ed4da702c5bb00ea5904b700ed4da702b9bb00ea5904b700ed4da702adbb00ea5903b700ed4da702a1bb00ea5904b700ed4da70295bb00ea5903b700ed4da70289bb00ea5904b700ed4da7027dbb00ea5903b700ed4da70271bb00ef59b700f04da702662ab40070b600f4c000f612f8b600fc99000812fea7001f2ab40070b600f4c000f6130100b600fc990009130102a700061301044da7022f2ab4006eb600f4c000eab6010804a0000913010aa7000613010cb80110130112b601164da702082ab4006ab600f4c000f64da701fa1301182ab40066b600f4c000f6b601164da701e62ab40064b600f4c000f613011ab600fc99000913011ca7000613011e2ab40072b600f4c000eab60122130124b601162ab4006cb600f4c000eab60122b60116130126b60116b601164da7019a2ab40068b600f4c000eab60122130128b60116bb00ea592ab40068b600f4c000eab601080460b700edb601220507b6012cb6011613012eb601164da7015c2ab40044b6012fc001314da7014e2ab40060b6012fc000f64da701402ab40070b600f4c000f612f8b600fcb801364da7012a2ab40044b6012fc001314da7011c2ab40060b6012fc000f64da7010e2ab40052b6012fc000f64da701002ab4005eb6012fc000f64da700f22ab40070b600f4c000f64da700e42ab4005ab6012fc000f64da700d62ab40070b600f4c000f6130100b600fcb801364da700bf2ab40044b6012fc001314da700b12ab40060b6012fc000f64da700a32ab40052b6012fc000f64da700952ab4005eb6012fc000f64da700872ab40070b600f4c000f64da700792ab4005ab6012fc000f64da7006b2ab40070b600f4c000f6130138b600fcb801364da700542ab40044b6012fc001314da700462ab40060b6012fc000f64da700382ab40052b6012fc000f64da7002a2ab4005eb6012fc000f64da7001c2ab40070b600f4c000f64da7000e2ab4005ab6012fc000f64d2cb000000001007f0000014e0053000000930002009500a8009900b1009a00b4009e00bd009f00c000a300c900a400cc00a800d500a900d800ad00e100ae00e400b200ed00b300f000b700f900b800fc00bc010500bd010800c1011000c2011300c6012500c7012a00c9013d00ca014300cc014600c6014700cd014a00d1016e00d2017100d6017c00d7017f00db019000dc019300e001dc00e101df00e5021a00e6021d00ea022800eb022b00ef023600f0023900f4024c00f5024f00f9025a00fa025d00fe026800ff026b01030276010402790108028401090287010d0292010e0295011202a0011302a3011702b7011802ba011c02c5011d02c8012102d3012202d6012602e1012702e4012b02ef012c02f2013002fd013103000135030b0136030e013a0322013b0325013f0330014003330144033e014503410149034c014a034f014e035a014f035d015303680154036b0158037601600001013900e5000200e600000004000100e80030000004d80005000300000378014d1baa000003730000000000000025000000a5000000b1000000bd000000c9000000d5000000e1000000ed000000f90000010500000110000001470000016e0000017c00000190000001dc0000021a00000228000002360000024c0000025a00000268000002760000028400000292000002a0000002b7000002c5000002d3000002e1000002ef000002fd0000030b00000322000003300000033e0000034c0000035a00000368bb00ea5904b700ed4da702c5bb00ea5904b700ed4da702b9bb00ea5904b700ed4da702adbb00ea5903b700ed4da702a1bb00ea5904b700ed4da70295bb00ea5903b700ed4da70289bb00ea5904b700ed4da7027dbb00ea5903b700ed4da70271bb00ef59b700f04da702662ab40070b6013cc000f612f8b600fc99000812fea7001f2ab40070b6013cc000f6130100b600fc990009130102a700061301044da7022f2ab4006eb6013cc000eab6010804a0000913010aa7000613010cb80110130112b601164da702082ab4006ab6013cc000f64da701fa1301182ab40066b6013cc000f6b601164da701e62ab40064b6013cc000f613011ab600fc99000913011ca7000613011e2ab40072b6013cc000eab60122130124b601162ab4006cb6013cc000eab60122b60116130126b60116b601164da7019a2ab40068b6013cc000eab60122130128b60116bb00ea592ab40068b6013cc000eab601080460b700edb601220507b6012cb6011613012eb601164da7015c2ab40044b6012fc001314da7014e2ab40060b6012fc000f64da701402ab40070b6013cc000f612f8b600fcb801364da7012a2ab40044b6012fc001314da7011c2ab40060b6012fc000f64da7010e2ab40052b6012fc000f64da701002ab4005eb6012fc000f64da700f22ab40070b6013cc000f64da700e42ab4005ab6012fc000f64da700d62ab40070b6013cc000f6130100b600fcb801364da700bf2ab40044b6012fc001314da700b12ab40060b6012fc000f64da700a32ab40052b6012fc000f64da700952ab4005eb6012fc000f64da700872ab40070b6013cc000f64da700792ab4005ab6012fc000f64da7006b2ab40070b6013cc000f6130138b600fcb801364da700542ab40044b6012fc001314da700462ab40060b6012fc000f64da700382ab40052b6012fc000f64da7002a2ab4005eb6012fc000f64da7001c2ab40070b6013cc000f64da7000e2ab4005ab6012fc000f64d2cb000000001007f0000014e0053000001690002016b00a8016f00b1017000b4017400bd017500c0017900c9017a00cc017e00d5017f00d8018300e1018400e4018800ed018900f0018d00f9018e00fc01920105019301080197011001980113019c0125019d012a019f013d01a0014301a20146019c014701a3014a01a7016e01a8017101ac017c01ad017f01b1019001b2019301b601dc01b701df01bb021a01bc021d01c0022801c1022b01c5023601c6023901ca024c01cb024f01cf025a01d0025d01d4026801d5026b01d9027601da027901de028401df028701e3029201e4029501e802a001e902a301ed02b701ee02ba01f202c501f302c801f702d301f802d601fc02e101fd02e4020102ef020202f2020602fd02070300020b030b020c030e02100322021103250215033002160333021a033e021b0341021f034c0220034f0224035a0225035d02290368022a036b022e037602360001013d00e5000200e600000004000100e80030000004d80005000300000378014d1baa000003730000000000000025000000a5000000b1000000bd000000c9000000d5000000e1000000ed000000f90000010500000110000001470000016e0000017c00000190000001dc0000021a00000228000002360000024c0000025a00000268000002760000028400000292000002a0000002b7000002c5000002d3000002e1000002ef000002fd0000030b00000322000003300000033e0000034c0000035a00000368bb00ea5904b700ed4da702c5bb00ea5904b700ed4da702b9bb00ea5904b700ed4da702adbb00ea5903b700ed4da702a1bb00ea5904b700ed4da70295bb00ea5903b700ed4da70289bb00ea5904b700ed4da7027dbb00ea5903b700ed4da70271bb00ef59b700f04da702662ab40070b600f4c000f612f8b600fc99000812fea7001f2ab40070b600f4c000f6130100b600fc990009130102a700061301044da7022f2ab4006eb600f4c000eab6010804a0000913010aa7000613010cb80110130112b601164da702082ab4006ab600f4c000f64da701fa1301182ab40066b600f4c000f6b601164da701e62ab40064b600f4c000f613011ab600fc99000913011ca7000613011e2ab40072b600f4c000eab60122130124b601162ab4006cb600f4c000eab60122b60116130126b60116b601164da7019a2ab40068b600f4c000eab60122130128b60116bb00ea592ab40068b600f4c000eab601080460b700edb601220507b6012cb6011613012eb601164da7015c2ab40044b6012fc001314da7014e2ab40060b6012fc000f64da701402ab40070b600f4c000f612f8b600fcb801364da7012a2ab40044b6012fc001314da7011c2ab40060b6012fc000f64da7010e2ab40052b6012fc000f64da701002ab4005eb6012fc000f64da700f22ab40070b600f4c000f64da700e42ab4005ab6012fc000f64da700d62ab40070b600f4c000f6130100b600fcb801364da700bf2ab40044b6012fc001314da700b12ab40060b6012fc000f64da700a32ab40052b6012fc000f64da700952ab4005eb6012fc000f64da700872ab40070b600f4c000f64da700792ab4005ab6012fc000f64da7006b2ab40070b600f4c000f6130138b600fcb801364da700542ab40044b6012fc001314da700462ab40060b6012fc000f64da700382ab40052b6012fc000f64da7002a2ab4005eb6012fc000f64da7001c2ab40070b600f4c000f64da7000e2ab4005ab6012fc000f64d2cb000000001007f0000014e00530000023f0002024100a8024500b1024600b4024a00bd024b00c0024f00c9025000cc025400d5025500d8025900e1025a00e4025e00ed025f00f0026300f9026400fc0268010502690108026d0110026e0113027201250273012a0275013d0276014302780146027201470279014a027d016e027e01710282017c0283017f0287019002880193028c01dc028d01df0291021a0292021d029602280297022b029b0236029c023902a0024c02a1024f02a5025a02a6025d02aa026802ab026b02af027602b0027902b4028402b5028702b9029202ba029502be02a002bf02a302c302b702c402ba02c802c502c902c802cd02d302ce02d602d202e102d302e402d702ef02d802f202dc02fd02dd030002e1030b02e2030e02e6032202e7032502eb033002ec033302f0033e02f1034102f5034c02f6034f02fa035a02fb035d02ff03680300036b03040376030c0001013e0000000200017400155f313433343438313538303036345f3637393338377400326e65742e73662e6a61737065727265706f7274732e656e67696e652e64657369676e2e4a524a61766163436f6d70696c6572);
+INSERT INTO `reports` (`id`, `file_name`, `descr`, `with_params`, `report`) VALUES
+(5, 'groupList.jasper', 'РЎРїРёСЃРѕРє РіСЂСѓРїРїС‹', 1, 0xaced0005737200286e65742e73662e6a61737065727265706f7274732e656e67696e652e4a61737065725265706f727400000000000027d80200034c000b636f6d70696c65446174617400164c6a6176612f696f2f53657269616c697a61626c653b4c0011636f6d70696c654e616d655375666669787400124c6a6176612f6c616e672f537472696e673b4c000d636f6d70696c6572436c61737371007e00027872002d6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173655265706f727400000000000027d802002a49001950534555444f5f53455249414c5f56455253494f4e5f55494449000c626f74746f6d4d617267696e49000b636f6c756d6e436f756e7449000d636f6c756d6e53706163696e6749000b636f6c756d6e57696474685a001069676e6f7265506167696e6174696f6e5a00136973466c6f6174436f6c756d6e466f6f7465725a0010697353756d6d6172794e6577506167655a0020697353756d6d6172795769746850616765486561646572416e64466f6f7465725a000e69735469746c654e65775061676549000a6c6566744d617267696e42000b6f7269656e746174696f6e49000a7061676548656967687449000970616765576964746842000a7072696e744f7264657249000b72696768744d617267696e490009746f704d617267696e42000e7768656e4e6f44617461547970654c000a6261636b67726f756e647400244c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5242616e643b4c000f636f6c756d6e446972656374696f6e7400334c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f52756e446972656374696f6e456e756d3b4c000c636f6c756d6e466f6f74657271007e00044c000c636f6c756d6e48656164657271007e00045b000864617461736574737400285b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52446174617365743b4c000c64656661756c745374796c657400254c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525374796c653b4c000664657461696c71007e00044c000d64657461696c53656374696f6e7400274c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5253656374696f6e3b4c0012666f726d6174466163746f7279436c61737371007e00024c000a696d706f72747353657474000f4c6a6176612f7574696c2f5365743b4c00086c616e677561676571007e00024c000e6c61737450616765466f6f74657271007e00044c000b6d61696e446174617365747400274c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52446174617365743b4c00046e616d6571007e00024c00066e6f4461746171007e00044c00106f7269656e746174696f6e56616c75657400324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4f7269656e746174696f6e456e756d3b4c000a70616765466f6f74657271007e00044c000a7061676548656164657271007e00044c000f7072696e744f7264657256616c75657400314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f5072696e744f72646572456e756d3b5b00067374796c65737400265b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525374796c653b4c000773756d6d61727971007e00045b000974656d706c6174657374002f5b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525265706f727454656d706c6174653b4c00057469746c6571007e00044c00137768656e4e6f446174615479706556616c75657400354c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f5768656e4e6f4461746154797065456e756d3b78700000c5460000001400000001000000000000022b000000000000000014000000034a00000253000000001400000014007372002b6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736542616e6400000000000027d802000749001950534555444f5f53455249414c5f56455253494f4e5f5549444900066865696768745a000e697353706c6974416c6c6f7765644c00137072696e745768656e45787072657373696f6e74002a4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5245787072657373696f6e3b4c000d70726f706572746965734d617074002d4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5250726f706572746965734d61703b4c000973706c6974547970657400104c6a6176612f6c616e672f427974653b4c000e73706c69745479706556616c75657400304c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f53706c697454797065456e756d3b787200336e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365456c656d656e7447726f757000000000000027d80200024c00086368696c6472656e7400104c6a6176612f7574696c2f4c6973743b4c000c656c656d656e7447726f757074002c4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52456c656d656e7447726f75703b7870737200136a6176612e7574696c2e41727261794c6973747881d21d99c7619d03000149000473697a6578700000000077040000000078700000c54600000000017070707e72002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e53706c697454797065456e756d00000000000000001200007872000e6a6176612e6c616e672e456e756d00000000000000001200007870740007535452455443487e7200316e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e52756e446972656374696f6e456e756d00000000000000001200007871007e001d7400034c54527070757200285b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a52446174617365743b4c1a3698cdac9c440200007870000000017372002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173654461746173657400000000000027d802001149001950534555444f5f53455249414c5f56455253494f4e5f5549445a000669734d61696e4200177768656e5265736f757263654d697373696e67547970655b00066669656c64737400265b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a524669656c643b4c001066696c74657245787072657373696f6e71007e00125b000667726f7570737400265b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5247726f75703b4c00046e616d6571007e00025b000a706172616d657465727374002a5b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52506172616d657465723b4c000d70726f706572746965734d617071007e00134c000571756572797400254c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5251756572793b4c000e7265736f7572636542756e646c6571007e00024c000e7363726970746c6574436c61737371007e00025b000a7363726970746c65747374002a5b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525363726970746c65743b5b000a736f72744669656c647374002a5b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52536f72744669656c643b4c0004757569647400104c6a6176612f7574696c2f555549443b5b00097661726961626c65737400295b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525661726961626c653b4c001c7768656e5265736f757263654d697373696e675479706556616c756574003e4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f5768656e5265736f757263654d697373696e6754797065456e756d3b78700000c5460000757200265b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a524669656c643b023cdfc74e2af2700200007870000000037372002c6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173654669656c6400000000000027d80200054c000b6465736372697074696f6e71007e00024c00046e616d6571007e00024c000d70726f706572746965734d617071007e00134c000e76616c7565436c6173734e616d6571007e00024c001276616c7565436c6173735265616c4e616d6571007e000278707400007400084c6173744e616d657372002b6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5250726f706572746965734d617000000000000027d80200034c00046261736571007e00134c000e70726f706572746965734c69737471007e00174c000d70726f706572746965734d617074000f4c6a6176612f7574696c2f4d61703b78707070707400106a6176612e6c616e672e537472696e67707371007e003274000074000946697273744e616d657371007e00367070707400106a6176612e6c616e672e537472696e67707371007e003274000074000a5365636f6e644e616d657371007e00367070707400106a6176612e6c616e672e537472696e6770707074000f53747564656e7473446174617365747572002a5b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a52506172616d657465723b22000c8d2ac36021020000787000000014737200306e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365506172616d6574657200000000000027d80200095a000e6973466f7250726f6d7074696e675a000f697353797374656d446566696e65644c001664656661756c7456616c756545787072657373696f6e71007e00124c000b6465736372697074696f6e71007e00024c00046e616d6571007e00024c000e6e6573746564547970654e616d6571007e00024c000d70726f706572746965734d617071007e00134c000e76616c7565436c6173734e616d6571007e00024c001276616c7565436c6173735265616c4e616d6571007e000278700101707074000e5245504f52545f434f4e54455854707371007e00367070707400296e65742e73662e6a61737065727265706f7274732e656e67696e652e5265706f7274436f6e74657874707371007e0047010170707400155245504f52545f504152414d45544552535f4d4150707371007e003670707074000d6a6176612e7574696c2e4d6170707371007e0047010170707400164a41535045525f5245504f5254535f434f4e54455854707371007e00367070707400306e65742e73662e6a61737065727265706f7274732e656e67696e652e4a61737065725265706f727473436f6e74657874707371007e00470101707074000d4a41535045525f5245504f5254707371007e00367070707400286e65742e73662e6a61737065727265706f7274732e656e67696e652e4a61737065725265706f7274707371007e0047010170707400115245504f52545f434f4e4e454354494f4e707371007e00367070707400136a6176612e73716c2e436f6e6e656374696f6e707371007e0047010170707400105245504f52545f4d41585f434f554e54707371007e00367070707400116a6176612e6c616e672e496e7465676572707371007e0047010170707400125245504f52545f444154415f534f55524345707371007e00367070707400286e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5244617461536f75726365707371007e0047010170707400105245504f52545f5343524950544c4554707371007e003670707074002f6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5241627374726163745363726970746c6574707371007e00470101707074000d5245504f52545f4c4f43414c45707371007e00367070707400106a6176612e7574696c2e4c6f63616c65707371007e0047010170707400165245504f52545f5245534f555243455f42554e444c45707371007e00367070707400186a6176612e7574696c2e5265736f7572636542756e646c65707371007e0047010170707400105245504f52545f54494d455f5a4f4e45707371007e00367070707400126a6176612e7574696c2e54696d655a6f6e65707371007e0047010170707400155245504f52545f464f524d41545f464143544f5259707371007e003670707074002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e7574696c2e466f726d6174466163746f7279707371007e0047010170707400135245504f52545f434c4153535f4c4f41444552707371007e00367070707400156a6176612e6c616e672e436c6173734c6f61646572707371007e00470101707074001a5245504f52545f55524c5f48414e444c45525f464143544f5259707371007e00367070707400206a6176612e6e65742e55524c53747265616d48616e646c6572466163746f7279707371007e0047010170707400145245504f52545f46494c455f5245534f4c564552707371007e003670707074002d6e65742e73662e6a61737065727265706f7274732e656e67696e652e7574696c2e46696c655265736f6c766572707371007e0047010170707400105245504f52545f54454d504c41544553707371007e00367070707400146a6176612e7574696c2e436f6c6c656374696f6e707371007e00470101707074000b534f52545f4649454c4453707371007e003670707074000e6a6176612e7574696c2e4c697374707371007e00470101707074000646494c544552707371007e00367070707400296e65742e73662e6a61737065727265706f7274732e656e67696e652e4461746173657446696c746572707371007e00470100707074000767726f75704964707371007e00367070707400116a6176612e6c616e672e496e7465676572707371007e00470100707074000573656d4964707371007e00367070707400116a6176612e6c616e672e496e7465676572707371007e00367070707372002c6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365517565727900000000000027d80200025b00066368756e6b7374002b5b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5251756572794368756e6b3b4c00086c616e677561676571007e000278707572002b5b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5251756572794368756e6b3b409f00a1e8ba34a4020000787000000005737200316e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736551756572794368756e6b00000000000027d8020004420004747970654c00047465787471007e00024c000e746f6b656e536570617261746f727400154c6a6176612f6c616e672f4368617261637465723b5b0006746f6b656e737400135b4c6a6176612f6c616e672f537472696e673b7870017400b853454c4543540a202020202020202020202020766965775f73747564656e74732e4c6173744e616d652c0a202020202020202020202020766965775f73747564656e74732e46697273744e616d652c0a202020202020202020202020766965775f73747564656e74732e5365636f6e644e616d650a202020202020202046524f4d2060766965775f73747564656e7473600a2020202020202020574845524520766965775f73747564656e74732e47726f75704944203d2070707371007e009e0274000767726f7570496470707371007e009e0174002e20414e440a2020202020202020202020202020766965775f73747564656e74732e53656d65737465724944203d2070707371007e009e0274000573656d496470707371007e009e0174004a0a20202020202020204f5244455220425920766965775f73747564656e74732e4c6173744e616d65204153432c20766965775f73747564656e74732e46697273744e616d65204153433b707074000373716c707070707372000e6a6176612e7574696c2e55554944bc9903f7986d852f0200024a000c6c65617374536967426974734a000b6d6f7374536967426974737870af32777268d3dc2c4b56b93034f4451b757200295b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a525661726961626c653b62e6837c982cb7440200007870000000057372002f6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173655661726961626c6500000000000027d802001149001950534555444f5f53455249414c5f56455253494f4e5f55494442000b63616c63756c6174696f6e42000d696e6372656d656e74547970655a000f697353797374656d446566696e65644200097265736574547970654c001063616c63756c6174696f6e56616c75657400324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f43616c63756c6174696f6e456e756d3b4c000a65787072657373696f6e71007e00124c000e696e6372656d656e7447726f75707400254c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5247726f75703b4c0012696e6372656d656e745479706556616c75657400344c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f496e6372656d656e7454797065456e756d3b4c001b696e6372656d656e746572466163746f7279436c6173734e616d6571007e00024c001f696e6372656d656e746572466163746f7279436c6173735265616c4e616d6571007e00024c0016696e697469616c56616c756545787072657373696f6e71007e00124c00046e616d6571007e00024c000a726573657447726f757071007e00b24c000e72657365745479706556616c75657400304c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f526573657454797065456e756d3b4c000e76616c7565436c6173734e616d6571007e00024c001276616c7565436c6173735265616c4e616d6571007e00027870000077ee000001007e7200306e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e43616c63756c6174696f6e456e756d00000000000000001200007871007e001d74000653595354454d70707e7200326e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e496e6372656d656e7454797065456e756d00000000000000001200007871007e001d7400044e4f4e457070737200316e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736545787072657373696f6e00000000000027d802000449000269645b00066368756e6b737400305b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5245787072657373696f6e4368756e6b3b4c000e76616c7565436c6173734e616d6571007e00024c001276616c7565436c6173735265616c4e616d6571007e0002787000000000757200305b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5245787072657373696f6e4368756e6b3b6d59cfde694ba355020000787000000001737200366e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736545787072657373696f6e4368756e6b00000000000027d8020002420004747970654c00047465787471007e00027870017400186e6577206a6176612e6c616e672e496e7465676572283129707074000b504147455f4e554d424552707e72002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e526573657454797065456e756d00000000000000001200007871007e001d7400065245504f525471007e005f707371007e00b0000077ee0000010071007e00b7707071007e00ba70707371007e00bc000000017571007e00bf000000017371007e00c1017400186e6577206a6176612e6c616e672e496e7465676572283129707074000d434f4c554d4e5f4e554d424552707e71007e00c57400045041474571007e005f707371007e00b0000077ee000001007e71007e00b6740005434f554e547371007e00bc000000027571007e00bf000000017371007e00c1017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ba70707371007e00bc000000037571007e00bf000000017371007e00c1017400186e6577206a6176612e6c616e672e496e7465676572283029707074000c5245504f52545f434f554e547071007e00c671007e005f707371007e00b0000077ee0000010071007e00d17371007e00bc000000047571007e00bf000000017371007e00c1017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ba70707371007e00bc000000057571007e00bf000000017371007e00c1017400186e6577206a6176612e6c616e672e496e7465676572283029707074000a504147455f434f554e547071007e00ce71007e005f707371007e00b0000077ee0000010071007e00d17371007e00bc000000067571007e00bf000000017371007e00c1017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ba70707371007e00bc000000077571007e00bf000000017371007e00c1017400186e6577206a6176612e6c616e672e496e7465676572283029707074000c434f4c554d4e5f434f554e54707e71007e00c5740006434f4c554d4e71007e005f707e72003c6e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e5768656e5265736f757263654d697373696e6754797065456e756d00000000000000001200007871007e001d7400044e554c4c70707372002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736553656374696f6e00000000000027d80200015b000562616e64737400255b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5242616e643b7870757200255b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5242616e643b95dd7eec8cca85350200007870000000017371007e00117371007e001a00000001770400000001737200376e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365436f6d706f6e656e74456c656d656e7400000000000027d80200024c0009636f6d706f6e656e747400314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f636f6d706f6e656e742f436f6d706f6e656e743b4c000c636f6d706f6e656e744b65797400344c6e65742f73662f6a61737065727265706f7274732f656e67696e652f636f6d706f6e656e742f436f6d706f6e656e744b65793b7872002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365456c656d656e7400000000000027d802001b49001950534555444f5f53455249414c5f56455253494f4e5f5549444900066865696768745a001769735072696e74496e466972737457686f6c6542616e645a001569735072696e74526570656174656456616c7565735a001a69735072696e745768656e44657461696c4f766572666c6f77735a0015697352656d6f76654c696e655768656e426c616e6b42000c706f736974696f6e5479706542000b7374726574636854797065490005776964746849000178490001794c00096261636b636f6c6f727400104c6a6176612f6177742f436f6c6f723b4c001464656661756c745374796c6550726f76696465727400344c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5244656661756c745374796c6550726f76696465723b4c000c656c656d656e7447726f757071007e00184c0009666f7265636f6c6f7271007e01004c00036b657971007e00024c00046d6f646571007e00144c00096d6f646556616c756574002b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4d6f6465456e756d3b4c000b706172656e745374796c6571007e00074c0018706172656e745374796c654e616d655265666572656e636571007e00024c0011706f736974696f6e5479706556616c75657400334c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f506f736974696f6e54797065456e756d3b4c00137072696e745768656e45787072657373696f6e71007e00124c00157072696e745768656e47726f75704368616e67657371007e00b24c000d70726f706572746965734d617071007e00135b001370726f706572747945787072657373696f6e737400335b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5250726f706572747945787072657373696f6e3b4c0010737472657463685479706556616c75657400324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f5374726574636854797065456e756d3b4c00047575696471007e002c78700000c546000000220001000000000000022b00000000000000007071007e001071007e00fa7070707070707e7200316e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e506f736974696f6e54797065456e756d00000000000000001200007871007e001d7400134649585f52454c41544956455f544f5f544f50707070707e7200306e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e5374726574636854797065456e756d00000000000000001200007871007e001d74000a4e4f5f535452455443487371007e00acb9d2b3ae12cf8a2a125931544d684935737200336e65742e73662e6a61737065727265706f7274732e636f6d706f6e656e74732e7461626c652e5374616e646172645461626c6500000000000027d80200034c0007636f6c756d6e7371007e00174c000a6461746173657452756e74002a4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a524461746173657452756e3b4c000e7768656e4e6f446174615479706574003f4c6e65742f73662f6a61737065727265706f7274732f636f6d706f6e656e74732f7461626c652f5768656e4e6f44617461547970655461626c65456e756d3b78707371007e001a00000002770400000002737200396e65742e73662e6a61737065727265706f7274732e636f6d706f6e656e74732e7461626c652e5374616e64617264436f6c756d6e47726f757000000000000027d80200014c00086368696c6472656e71007e0017787200386e65742e73662e6a61737065727265706f7274732e636f6d706f6e656e74732e7461626c652e5374616e6461726442617365436f6c756d6e00000000000027d802000b4c000c636f6c756d6e466f6f74657274002c4c6e65742f73662f6a61737065727265706f7274732f636f6d706f6e656e74732f7461626c652f43656c6c3b4c000c636f6c756d6e48656164657271007e01154c000c67726f7570466f6f7465727371007e00174c000c67726f75704865616465727371007e00174c00137072696e745768656e45787072657373696f6e71007e00124c000d70726f706572746965734d617071007e00134c001370726f706572747945787072657373696f6e7371007e00174c000b7461626c65466f6f74657271007e01154c000b7461626c6548656164657271007e01154c00047575696471007e002c4c000577696474687400134c6a6176612f6c616e672f496e74656765723b787070737200326e65742e73662e6a61737065727265706f7274732e636f6d706f6e656e74732e7461626c652e436f6d70696c656443656c6c00000000000027d80200074c0003626f787400274c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a524c696e65426f783b4c001464656661756c745374796c6550726f766964657271007e01014c000668656967687471007e01164c000d70726f706572746965734d617071007e00134c0007726f775370616e71007e01164c00057374796c6571007e00074c00127374796c654e616d655265666572656e636571007e00027871007e00167371007e001a00000001770400000001737200316e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173655374617469635465787400000000000027d80200014c00047465787471007e0002787200326e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736554657874456c656d656e7400000000000027d802002649001950534555444f5f53455249414c5f56455253494f4e5f5549444c0006626f7264657271007e00144c000b626f72646572436f6c6f7271007e01004c000c626f74746f6d426f7264657271007e00144c0011626f74746f6d426f72646572436f6c6f7271007e01004c000d626f74746f6d50616464696e6771007e01164c0008666f6e744e616d6571007e00024c0008666f6e7453697a6571007e01164c0008666f6e7473697a657400114c6a6176612f6c616e672f466c6f61743b4c0013686f72697a6f6e74616c416c69676e6d656e7471007e00144c0018686f72697a6f6e74616c416c69676e6d656e7456616c75657400364c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f486f72697a6f6e74616c416c69676e456e756d3b4c00066973426f6c647400134c6a6176612f6c616e672f426f6f6c65616e3b4c000869734974616c696371007e01204c000d6973506466456d62656464656471007e01204c000f6973537472696b655468726f75676871007e01204c000c69735374796c65645465787471007e01204c000b6973556e6465726c696e6571007e01204c000a6c656674426f7264657271007e00144c000f6c656674426f72646572436f6c6f7271007e01004c000b6c65667450616464696e6771007e01164c00076c696e65426f7871007e01194c000b6c696e6553706163696e6771007e00144c00106c696e6553706163696e6756616c75657400324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4c696e6553706163696e67456e756d3b4c00066d61726b757071007e00024c000770616464696e6771007e01164c00097061726167726170687400294c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525061726167726170683b4c000b706466456e636f64696e6771007e00024c000b706466466f6e744e616d6571007e00024c000b7269676874426f7264657271007e00144c00107269676874426f72646572436f6c6f7271007e01004c000c726967687450616464696e6771007e01164c0008726f746174696f6e71007e00144c000d726f746174696f6e56616c756574002f4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f526f746174696f6e456e756d3b4c0009746f70426f7264657271007e00144c000e746f70426f72646572436f6c6f7271007e01004c000a746f7050616464696e6771007e01164c0011766572746963616c416c69676e6d656e7471007e00144c0016766572746963616c416c69676e6d656e7456616c75657400344c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f566572746963616c416c69676e456e756d3b7871007e00ff0000c54600000014000100000000000000f200000000000000007071007e001071007e011a70707070707071007e01087070707071007e010b7371007e00ac96c43145b8edb9452275c51982bf4e0a0000c5467070707070740005417269616c7070707e7200346e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e486f72697a6f6e74616c416c69676e456e756d00000000000000001200007871007e001d74000643454e5445527070707070707070707372002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173654c696e65426f7800000000000027d802000b4c000d626f74746f6d50616464696e6771007e01164c0009626f74746f6d50656e74002b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f626173652f4a52426f7850656e3b4c000c626f78436f6e7461696e657274002c4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52426f78436f6e7461696e65723b4c000b6c65667450616464696e6771007e01164c00076c65667450656e71007e012c4c000770616464696e6771007e01164c000370656e71007e012c4c000c726967687450616464696e6771007e01164c0008726967687450656e71007e012c4c000a746f7050616464696e6771007e01164c0006746f7050656e71007e012c787070737200336e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365426f78426f74746f6d50656e00000000000027d80200007872002d6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365426f7850656e00000000000027d80200014c00076c696e65426f7871007e01197872002a6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736550656e00000000000027d802000649001950534555444f5f53455249414c5f56455253494f4e5f5549444c00096c696e65436f6c6f7271007e01004c00096c696e655374796c6571007e00144c000e6c696e655374796c6556616c75657400304c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4c696e655374796c65456e756d3b4c00096c696e65576964746871007e011e4c000c70656e436f6e7461696e657274002c4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5250656e436f6e7461696e65723b78700000c5467070707372000f6a6176612e6c616e672e466c6f6174daedc9a2db3cf0ec02000146000576616c7565787200106a6176612e6c616e672e4e756d62657286ac951d0b94e08b02000078703f00000071007e012e71007e012e71007e012570737200316e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365426f784c65667450656e00000000000027d80200007871007e01300000c5467070707371007e01353f00000071007e012e71007e012e707371007e01300000c5467070707071007e012e71007e012e70737200326e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365426f78526967687450656e00000000000027d80200007871007e01300000c5467070707371007e01353f00000071007e012e71007e012e70737200306e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365426f78546f7050656e00000000000027d80200007871007e01300000c5467070707371007e01353f00000071007e012e71007e012e70707070737200306e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736550617261677261706800000000000027d802000a4c000f66697273744c696e65496e64656e7471007e01164c000a6c656674496e64656e7471007e01164c000b6c696e6553706163696e6771007e01214c000f6c696e6553706163696e6753697a6571007e011e4c0012706172616772617068436f6e7461696e65727400324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52506172616772617068436f6e7461696e65723b4c000b7269676874496e64656e7471007e01164c000c73706163696e67416674657271007e01164c000d73706163696e674265666f726571007e01164c000c74616253746f70576964746871007e01164c000874616253746f707371007e001778707070707071007e0125707070707070707070707070707070707e7200326e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e566572746963616c416c69676e456e756d00000000000000001200007871007e001d7400064d4944444c45740009d0a42ed0982ed09e2e78707371007e012b707371007e012f0000c5467070707071007e014971007e014971007e011a707371007e01380000c5467070707071007e014971007e0149707371007e01300000c5467070707071007e014971007e0149707371007e013c0000c5467070707071007e014971007e0149707371007e013f0000c5467070707071007e014971007e014971007e0010737200116a6176612e6c616e672e496e746567657212e2a0a4f781873802000149000576616c75657871007e013600000014707371007e014f0000000170707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00acad0bc51f3d38b7ee5178008fc1244f6b7371007e014f000000f27371007e001a00000002770400000002737200346e65742e73662e6a61737065727265706f7274732e636f6d706f6e656e74732e7461626c652e5374616e64617264436f6c756d6e00000000000027d80200014c000664657461696c71007e01157871007e011470707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00ac91e21d444363fa8decd21e521d3f4d1c7371007e014f000000167371007e01187371007e001a00000001770400000001737200306e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365546578744669656c6400000000000027d802001549001950534555444f5f53455249414c5f56455253494f4e5f55494449000d626f6f6b6d61726b4c6576656c42000e6576616c756174696f6e54696d6542000f68797065726c696e6b54617267657442000d68797065726c696e6b547970655a0015697353747265746368576974684f766572666c6f774c0014616e63686f724e616d6545787072657373696f6e71007e00124c000f6576616c756174696f6e47726f757071007e00b24c00136576616c756174696f6e54696d6556616c75657400354c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4576616c756174696f6e54696d65456e756d3b4c000a65787072657373696f6e71007e00124c001968797065726c696e6b416e63686f7245787072657373696f6e71007e00124c001768797065726c696e6b5061676545787072657373696f6e71007e00125b001368797065726c696e6b506172616d65746572737400335b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5248797065726c696e6b506172616d657465723b4c001c68797065726c696e6b5265666572656e636545787072657373696f6e71007e00124c001a68797065726c696e6b546f6f6c74697045787072657373696f6e71007e00124c001768797065726c696e6b5768656e45787072657373696f6e71007e00124c000f6973426c616e6b5768656e4e756c6c71007e01204c000a6c696e6b54617267657471007e00024c00086c696e6b5479706571007e00024c00077061747465726e71007e00024c00117061747465726e45787072657373696f6e71007e00127871007e011d0000c5460000000e0001000000000000001600000000000000007071007e001071007e015f70707070707071007e01087070707071007e010b7371007e00ac9aab8d6d2c22a42580babbdd85e142fb0000c5467070707070740005417269616c707070707070707070707070707371007e012b707371007e012f0000c5467070707371007e01353f00000071007e016771007e016771007e01647371007e014f000000027371007e01380000c5467070707371007e01353f00000071007e016771007e0167707371007e01300000c5467070707071007e016771007e0167707371007e013c0000c5467070707371007e01353f00000071007e016771007e0167707371007e013f0000c5467070707371007e01353f00000071007e016771007e0167707070707371007e01427070707071007e01647070707070707070707070707070707071007e01460000c546000000000000000070707e7200336e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e4576616c756174696f6e54696d65456e756d00000000000000001200007871007e001d7400034e4f577371007e00bc000000087571007e00bf000000017371007e00c10474000c5245504f52545f434f554e547070707070707070707070707078707371007e012b707371007e012f0000c5467070707071007e017a71007e017a71007e015f707371007e01380000c5467070707071007e017a71007e017a707371007e01300000c5467070707071007e017a71007e017a707371007e013c0000c5467070707071007e017a71007e017a707371007e013f0000c5467070707071007e017a71007e017a71007e00107371007e014f0000000e707371007e014f0000000170707371007e015870707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00ac96e7868b5c59afefbf4d8525e07646dd7371007e014f000000dc7371007e01187371007e001a000000017704000000017371007e01610000c5460000000e000100000000000000dc00000000000000007071007e001071007e018870707070707071007e01087070707071007e010b7371007e00ac9f120a1f56b43d418d9ef21c604443380000c5467070707070740005417269616c707070707070707070707070707371007e012b707371007e012f0000c5467070707371007e01353f00000071007e018d71007e018d71007e018a71007e016a7371007e01380000c5467070707371007e01353f00000071007e018d71007e018d707371007e01300000c5467070707071007e018d71007e018d707371007e013c0000c5467070707371007e01353f00000071007e018d71007e018d707371007e013f0000c5467070707371007e01353f00000071007e018d71007e018d707070707371007e01427070707071007e018a7070707070707070707070707070707071007e01460000c5460000000000000000707071007e01747371007e00bc000000097571007e00bf000000057371007e00c1037400084c6173744e616d657371007e00c101740009202b20222022202b207371007e00c10374000946697273744e616d657371007e00c101740009202b20222022202b207371007e00c10374000a5365636f6e644e616d657070707070707070707070707078707371007e012b707371007e012f0000c5467070707071007e01a471007e01a471007e0188707371007e01380000c5467070707071007e01a471007e01a4707371007e01300000c5467070707071007e01a471007e01a4707371007e013c0000c5467070707071007e01a471007e01a4707371007e013f0000c5467070707071007e01a471007e01a471007e00107371007e014f0000000e707371007e014f000000017070787371007e0158707371007e01187371007e001a0000000077040000000078707371007e012b707371007e012f0000c5467070707371007e01353f00000071007e01af71007e01af71007e01ad707371007e01380000c5467070707371007e01353f00000071007e01af71007e01af707371007e01300000c5467070707071007e01af71007e01af707371007e013c0000c5467070707371007e01353f00000071007e01af71007e01af707371007e013f0000c5467070707371007e01353f00000071007e01af71007e01af71007e001071007e0150707371007e014f0000000170707371007e001a00000000770400000000787371007e001a000000007704000000007870707371007e001a000000007704000000007870707371007e00ac9adde6cab8b9e1d6459b33c49dec4b7e7371007e014f000001387371007e01187371007e001a0000000077040000000078707371007e012b707371007e012f0000c5467070707371007e01353f00000071007e01c171007e01c171007e01bf707371007e01380000c5467070707371007e01353f00000071007e01c171007e01c1707371007e01300000c5467070707071007e01c171007e01c1707371007e013c0000c5467070707371007e01353f00000071007e01c171007e01c1707371007e013f0000c5467070707371007e01353f00000071007e01c171007e01c171007e00107371007e014f0000000e707371007e014f00000001707078737200316e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173654461746173657452756e00000000000027d80200084c0014636f6e6e656374696f6e45787072657373696f6e71007e00124c001464617461536f7572636545787072657373696f6e71007e00124c000b646174617365744e616d6571007e00025b000a706172616d65746572737400315b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5244617461736574506172616d657465723b4c0017706172616d65746572734d617045787072657373696f6e71007e00124c000d70726f706572746965734d617071007e00134c000c72657475726e56616c75657371007e00174c00047575696471007e002c78707371007e00bc0000000d7571007e00bf000000017371007e00c1027400115245504f52545f434f4e4e454354494f4e70707074000f53747564656e7473446174617365747572003a5b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736544617461736574506172616d657465723b2413b76c659575a5020000787000000002737200376e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736544617461736574506172616d6574657200000000000027d80200024c000a65787072657373696f6e71007e00124c00046e616d6571007e000278707371007e00bc0000000e7571007e00bf000000017371007e00c10374000767726f75704964707074000767726f757049647371007e01d77371007e00bc0000000f7571007e00bf000000017371007e00c10374000573656d4964707074000573656d49647070707371007e00acabf10c716ab1a6d6724bdaa772434e567e72003d6e65742e73662e6a61737065727265706f7274732e636f6d706f6e656e74732e7461626c652e5768656e4e6f44617461547970655461626c65456e756d00000000000000001200007871007e001d740005424c414e4b737200326e65742e73662e6a61737065727265706f7274732e656e67696e652e636f6d706f6e656e742e436f6d706f6e656e744b657900000000000027d80200034c00046e616d6571007e00024c00096e616d65737061636571007e00024c000f6e616d65737061636550726566697871007e000278707400057461626c6574003d687474703a2f2f6a61737065727265706f7274732e736f75726365666f7267652e6e65742f6a61737065727265706f7274732f636f6d706f6e656e74737400026a7278700000c54600000022017070707070707400046a617661707371007e00250000c54601007571007e0030000000047371007e00327074000767726f757049647371007e00367070707400116a6176612e6c616e672e496e7465676572707371007e003270740008737065634e616d657371007e00367070707400106a6176612e6c616e672e537472696e67707371007e0032707400076661634e616d657371007e00367070707400106a6176612e6c616e672e537472696e67707371007e00327074000573656d49647371007e00367070707400116a6176612e6c616e672e496e746567657270707074000967726f75704c6973747571007e00450000001a7371007e00470101707071007e0049707371007e003670707071007e004b707371007e00470101707071007e004d707371007e003670707071007e004f707371007e00470101707071007e0051707371007e003670707071007e0053707371007e00470101707071007e0055707371007e003670707071007e0057707371007e00470101707071007e0059707371007e003670707071007e005b707371007e00470101707071007e005d707371007e003670707071007e005f707371007e00470101707071007e0061707371007e003670707071007e0063707371007e00470101707071007e0065707371007e003670707071007e0067707371007e00470101707071007e0069707371007e003670707071007e006b707371007e00470101707071007e006d707371007e003670707071007e006f707371007e00470101707071007e0071707371007e003670707071007e0073707371007e00470101707071007e0075707371007e003670707071007e0077707371007e00470101707071007e0079707371007e003670707071007e007b707371007e00470101707071007e007d707371007e003670707071007e007f707371007e00470101707071007e0081707371007e003670707071007e0083707371007e00470101707071007e0085707371007e003670707071007e0087707371007e00470101707071007e0089707371007e003670707071007e008b707371007e00470101707071007e008d707371007e003670707071007e008f707371007e0047010170707400125245504f52545f5649525455414c495a4552707371007e00367070707400296e65742e73662e6a61737065727265706f7274732e656e67696e652e4a525669727475616c697a6572707371007e00470101707074001449535f49474e4f52455f504147494e4154494f4e707371007e00367070707400116a6176612e6c616e672e426f6f6c65616e707371007e00470100707074000867726f75704e756d707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e004701007070740009636f757273654e756d707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e004701007070740006646567726565707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e00470100707074000873656d6573746572707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e004701007371007e00bc000000007571007e00bf000000027371007e00c10274000873656d65737465727371007e00c1017400112e73706c69742820222c202220295b315d70707074000673656d4e756d707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e004701007371007e00bc000000017571007e00bf000000027371007e00c10274000873656d65737465727371007e00c1017400102e73706c69742820222c2022295b305d70707074000773656d59656172707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e0036707371007e001a0000000377040000000374000c697265706f72742e7a6f6f6d740009697265706f72742e78740009697265706f72742e7978737200116a6176612e7574696c2e486173684d61700507dac1c31660d103000246000a6c6f6164466163746f724900097468726573686f6c6478703f400000000000037708000000040000000371007e02567400013071007e0254740003312e3071007e025574000130787371007e00997571007e009c0000000a7371007e009e0174006973656c6563740a09735f672e49642061732067726f757049642c20732e6e616d6520617320737065634e616d652c20662e6e616d65206173206661634e616d652c202873656c6563742069642066726f6d2073656d657374657273207768657265206079656172603d70707371007e009e0274000773656d5965617270707371007e009e0174000920616e64206e756d3d70707371007e009e0274000673656d4e756d70707371007e009e017400c4292061732073656d49640a66726f6d0a0973747564795f67726f75707320735f670a202020206a6f696e206772616465732067206f6e20735f672e67726164654964203d20672e69640a202020206a6f696e207370656369616c697a6174696f6e732073206f6e20735f672e7370656369616c697a6174696f6e4964203d20732e69640a202020206a6f696e20666163756c746965732066206f6e20732e666163756c74794964203d20662e69640a776865726520735f672e47726f75704e756d203d2070707371007e009e0274000867726f75704e756d70707371007e009e0174000d20616e6420672e4e756d203d2070707371007e009e02740009636f757273654e756d70707371007e009e0174001d20616e6420662e4944203d203120616e6420672e646567726565203d2070707371007e009e02740006646567726565707071007e00ab707070707371007e00aca5ca793b8f69c2cfdff5db88bf274a0b7571007e00ae000000057371007e00b0000077ee0000010071007e00b7707071007e00ba70707371007e00bc000000027571007e00bf000000017371007e00c1017400186e6577206a6176612e6c616e672e496e7465676572283129707071007e00c47071007e00c671007e005f707371007e00b0000077ee0000010071007e00b7707071007e00ba70707371007e00bc000000037571007e00bf000000017371007e00c1017400186e6577206a6176612e6c616e672e496e7465676572283129707071007e00cd7071007e00ce71007e005f707371007e00b0000077ee0000010071007e00d17371007e00bc000000047571007e00bf000000017371007e00c1017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ba70707371007e00bc000000057571007e00bf000000017371007e00c1017400186e6577206a6176612e6c616e672e496e7465676572283029707071007e00db7071007e00c671007e005f707371007e00b0000077ee0000010071007e00d17371007e00bc000000067571007e00bf000000017371007e00c1017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ba70707371007e00bc000000077571007e00bf000000017371007e00c1017400186e6577206a6176612e6c616e672e496e7465676572283029707071007e00e57071007e00ce71007e005f707371007e00b0000077ee0000010071007e00d17371007e00bc000000087571007e00bf000000017371007e00c1017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ba70707371007e00bc000000097571007e00bf000000017371007e00c1017400186e6577206a6176612e6c616e672e496e7465676572283029707071007e00ef7071007e00f071007e005f7071007e00f371007e0200707e7200306e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e4f7269656e746174696f6e456e756d00000000000000001200007871007e001d740008504f52545241495470707e72002f6e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e5072696e744f72646572456e756d00000000000000001200007871007e001d740008564552544943414c7070707371007e00117371007e001a000000037704000000037371007e01610000c546000000140001000000000000022b00000000000000007071007e001071007e029f70707070707071007e01087070707071007e010b7371007e00acb7e0ac70afc6b55c1808fef47f8e41de0000c5467070707070740005417269616c707371007e01354140000070707070707070707070707371007e012b707371007e012f0000c5467070707071007e02a571007e02a571007e02a1707371007e01380000c5467070707071007e02a571007e02a5707371007e01300000c5467070707071007e02a571007e02a5707371007e013c0000c5467070707071007e02a571007e02a5707371007e013f0000c5467070707071007e02a571007e02a5707070707371007e01427070707071007e02a17070707070707070707070707070707071007e01460000c5460000000000000000707071007e01747371007e00bc0000000a7571007e00bf000000027371007e00c10174001922d0a4d0b0d0bad183d0bbd18cd182d0b5d1823a2022202b207371007e00c1037400076661634e616d65707070707070707070707070707371007e01610000c546000000140001000000000000022b00000000000000147071007e001071007e029f70707070707071007e01087070707071007e010b7371007e00acaf3f24986f9a584c7602ba5b2bef4cd40000c5467070707070740005417269616c707371007e01354140000070707070707070707070707371007e012b707371007e012f0000c5467070707071007e02b671007e02b671007e02b2707371007e01380000c5467070707071007e02b671007e02b6707371007e01300000c5467070707071007e02b671007e02b6707371007e013c0000c5467070707071007e02b671007e02b6707371007e013f0000c5467070707071007e02b671007e02b6707070707371007e01427070707071007e02b27070707070707070707070707070707071007e01460000c5460000000000000000707071007e01747371007e00bc0000000b7571007e00bf0000000b7371007e00c10174000e22d09ad183d180d1812022202b207371007e00c102740009636f757273654e756d7371007e00c101740017202b20222c20d0b3d180d183d0bfd0bfd0b02022202b207371007e00c10274000867726f75704e756d7371007e00c10174000c202b20222c20220d0a2b20287371007e00c10274000673656d4e756d7371007e00c101740055203d3d20223122203f2022d0bed181d0b5d0bdd0bdd0b8d0b922203a2022d0b2d0b5d181d0b5d0bdd0bdd0b8d0b922292e636f6e636174282220d181d0b5d0bcd0b5d181d182d180202229202b202220220d0a2b207371007e00c10274000773656d596561727371007e00c1017400312e636f6e63617428222f22292e636f6e63617428537472696e672e76616c75654f662828286e657720496e7465676572287371007e00c10274000773656d596561727371007e00c10174002c2929202b203129292e737562737472696e6728322c3429292e636f6e636174282220d183d1872ed0b32e2229707070707070707070707070707371007e01610000c546000000140001000000000000022b00000000000000287071007e001071007e029f70707070707071007e01087070707071007e010b7371007e00ac8d17296b675aff39237ba10129de429c0000c5467070707070740005417269616c707371007e01354140000070707070707070707070707371007e012b707371007e012f0000c5467070707071007e02d971007e02d971007e02d5707371007e01380000c5467070707071007e02d971007e02d9707371007e01300000c5467070707071007e02d971007e02d9707371007e013c0000c5467070707071007e02d971007e02d9707371007e013f0000c5467070707071007e02d971007e02d9707070707371007e01427070707071007e02d57070707070707070707070707070707071007e01460000c5460000000000000000707071007e01747371007e00bc0000000c7571007e00bf000000027371007e00c10174002122d0a1d0bfd0b5d186d0b8d0b0d0bbd18cd0bdd0bed181d182d18c3a2022202b207371007e00c103740008737065634e616d657070707070707070707070707078700000c5460000003c0170707071007e001e7e7200336e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e5768656e4e6f4461746154797065456e756d00000000000000001200007871007e001d7400084e4f5f5041474553737200366e65742e73662e6a61737065727265706f7274732e656e67696e652e64657369676e2e4a525265706f7274436f6d70696c654461746100000000000027d80200034c001363726f7373746162436f6d70696c654461746171007e00374c001264617461736574436f6d70696c654461746171007e00374c00166d61696e44617461736574436f6d70696c654461746171007e000178707371007e02573f4000000000001077080000001000000000787371007e02573f4000000000000c7708000000100000000171007e0044757200025b42acf317f8060854e002000078700000148ecafebabe0000002e00e001002e67726f75704c6973745f53747564656e7473446174617365745f313433333237383331303933305f31323438313307000101002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a524576616c7561746f72070003010017706172616d657465725f5245504f52545f4c4f43414c450100324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d657465723b010017706172616d657465725f4a41535045525f5245504f525401001a706172616d657465725f5245504f52545f54494d455f5a4f4e45010015706172616d657465725f534f52545f4649454c445301001e706172616d657465725f5245504f52545f46494c455f5245534f4c56455201001a706172616d657465725f5245504f52545f5343524950544c455401001f706172616d657465725f5245504f52545f504152414d45544552535f4d415001001b706172616d657465725f5245504f52545f434f4e4e454354494f4e010018706172616d657465725f5245504f52545f434f4e5445585401001d706172616d657465725f5245504f52545f434c4153535f4c4f41444552010024706172616d657465725f5245504f52545f55524c5f48414e444c45525f464143544f525901001c706172616d657465725f5245504f52545f444154415f534f55524345010010706172616d657465725f46494c544552010011706172616d657465725f67726f75704964010020706172616d657465725f4a41535045525f5245504f5254535f434f4e5445585401001f706172616d657465725f5245504f52545f464f524d41545f464143544f525901001a706172616d657465725f5245504f52545f4d41585f434f554e5401000f706172616d657465725f73656d496401001a706172616d657465725f5245504f52545f54454d504c41544553010020706172616d657465725f5245504f52545f5245534f555243455f42554e444c4501000f6669656c645f46697273744e616d6501002e4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c643b01000e6669656c645f4c6173744e616d650100106669656c645f5365636f6e644e616d650100147661726961626c655f504147455f4e554d4245520100314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c653b0100167661726961626c655f434f4c554d4e5f4e554d4245520100157661726961626c655f5245504f52545f434f554e540100137661726961626c655f504147455f434f554e540100157661726961626c655f434f4c554d4e5f434f554e540100063c696e69743e010003282956010004436f64650c002400250a000400270c0005000609000200290c00070006090002002b0c00080006090002002d0c00090006090002002f0c000a000609000200310c000b000609000200330c000c000609000200350c000d000609000200370c000e000609000200390c000f0006090002003b0c00100006090002003d0c00110006090002003f0c0012000609000200410c0013000609000200430c0014000609000200450c0015000609000200470c0016000609000200490c00170006090002004b0c00180006090002004d0c00190006090002004f0c001a001b09000200510c001c001b09000200530c001d001b09000200550c001e001f09000200570c0020001f09000200590c0021001f090002005b0c0022001f090002005d0c0023001f090002005f01000f4c696e654e756d6265725461626c6501000e637573746f6d697a6564496e6974010030284c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b295601000a696e6974506172616d73010012284c6a6176612f7574696c2f4d61703b29560c006400650a0002006601000a696e69744669656c64730c006800650a00020069010008696e6974566172730c006b00650a0002006c01000d5245504f52545f4c4f43414c4508006e01000d6a6176612f7574696c2f4d6170070070010003676574010026284c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f4f626a6563743b0c007200730b007100740100306e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d6574657207007601000d4a41535045525f5245504f52540800780100105245504f52545f54494d455f5a4f4e4508007a01000b534f52545f4649454c445308007c0100145245504f52545f46494c455f5245534f4c56455208007e0100105245504f52545f5343524950544c45540800800100155245504f52545f504152414d45544552535f4d41500800820100115245504f52545f434f4e4e454354494f4e08008401000e5245504f52545f434f4e544558540800860100135245504f52545f434c4153535f4c4f4144455208008801001a5245504f52545f55524c5f48414e444c45525f464143544f525908008a0100125245504f52545f444154415f534f5552434508008c01000646494c54455208008e01000767726f757049640800900100164a41535045525f5245504f5254535f434f4e544558540800920100155245504f52545f464f524d41545f464143544f52590800940100105245504f52545f4d41585f434f554e5408009601000573656d49640800980100105245504f52545f54454d504c4154455308009a0100165245504f52545f5245534f555243455f42554e444c4508009c01000946697273744e616d6508009e01002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c640700a00100084c6173744e616d650800a201000a5365636f6e644e616d650800a401000b504147455f4e554d4245520800a601002f6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c650700a801000d434f4c554d4e5f4e554d4245520800aa01000c5245504f52545f434f554e540800ac01000a504147455f434f554e540800ae01000c434f4c554d4e5f434f554e540800b00100086576616c756174650100152849294c6a6176612f6c616e672f4f626a6563743b01000a457863657074696f6e730100136a6176612f6c616e672f5468726f7761626c650700b50100116a6176612f6c616e672f496e74656765720700b7010004284929560c002400b90a00b800ba01000867657456616c756501001428294c6a6176612f6c616e672f4f626a6563743b0c00bc00bd0a00a900be0100166a6176612f6c616e672f537472696e674275666665720700c00a00a100be0100106a6176612f6c616e672f537472696e670700c301000776616c75654f66010026284c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f537472696e673b0c00c500c60a00c400c7010015284c6a6176612f6c616e672f537472696e673b29560c002400c90a00c100ca010001200800cc010006617070656e6401002c284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f537472696e674275666665723b0c00ce00cf0a00c100d0010008746f537472696e6701001428294c6a6176612f6c616e672f537472696e673b0c00d200d30a00c100d401000b6576616c756174654f6c6401000b6765744f6c6456616c75650c00d700bd0a00a900d80a00a100d80100116576616c75617465457374696d61746564010011676574457374696d6174656456616c75650c00dc00bd0a00a900dd01000a536f7572636546696c650021000200040000001c00020005000600000002000700060000000200080006000000020009000600000002000a000600000002000b000600000002000c000600000002000d000600000002000e000600000002000f0006000000020010000600000002001100060000000200120006000000020013000600000002001400060000000200150006000000020016000600000002001700060000000200180006000000020019000600000002001a001b00000002001c001b00000002001d001b00000002001e001f000000020020001f000000020021001f000000020022001f000000020023001f00000008000100240025000100260000011d00020001000000912ab700282a01b5002a2a01b5002c2a01b5002e2a01b500302a01b500322a01b500342a01b500362a01b500382a01b5003a2a01b5003c2a01b5003e2a01b500402a01b500422a01b500442a01b500462a01b500482a01b5004a2a01b5004c2a01b5004e2a01b500502a01b500522a01b500542a01b500562a01b500582a01b5005a2a01b5005c2a01b5005e2a01b50060b10000000100610000007a001e00000012000400190009001a000e001b0013001c0018001d001d001e0022001f00270020002c00210031002200360023003b00240040002500450026004a0027004f0028005400290059002a005e002b0063002c0068002d006d002e0072002f00770030007c00310081003200860033008b003400900012000100620063000100260000003400020004000000102a2bb700672a2cb7006a2a2db7006db10000000100610000001200040000004000050041000a0042000f004300020064006500010026000001d100030002000001692a2b126fb900750200c00077c00077b5002a2a2b1279b900750200c00077c00077b5002c2a2b127bb900750200c00077c00077b5002e2a2b127db900750200c00077c00077b500302a2b127fb900750200c00077c00077b500322a2b1281b900750200c00077c00077b500342a2b1283b900750200c00077c00077b500362a2b1285b900750200c00077c00077b500382a2b1287b900750200c00077c00077b5003a2a2b1289b900750200c00077c00077b5003c2a2b128bb900750200c00077c00077b5003e2a2b128db900750200c00077c00077b500402a2b128fb900750200c00077c00077b500422a2b1291b900750200c00077c00077b500442a2b1293b900750200c00077c00077b500462a2b1295b900750200c00077c00077b500482a2b1297b900750200c00077c00077b5004a2a2b1299b900750200c00077c00077b5004c2a2b129bb900750200c00077c00077b5004e2a2b129db900750200c00077c00077b50050b10000000100610000005600150000004b0012004c0024004d0036004e0048004f005a0050006c0051007e00520090005300a2005400b4005500c6005600d8005700ea005800fc0059010e005a0120005b0132005c0144005d0156005e0168005f000200680065000100260000005b00030002000000372a2b129fb900750200c000a1c000a1b500522a2b12a3b900750200c000a1c000a1b500542a2b12a5b900750200c000a1c000a1b50056b10000000100610000001200040000006700120068002400690036006a0002006b00650001002600000087000300020000005b2a2b12a7b900750200c000a9c000a9b500582a2b12abb900750200c000a9c000a9b5005a2a2b12adb900750200c000a9c000a9b5005c2a2b12afb900750200c000a9c000a9b5005e2a2b12b1b900750200c000a9c000a9b50060b10000000100610000001a00060000007200120073002400740036007500480076005a0077000100b200b3000200b400000004000100b600260000015000030003000000e4014d1baa000000df000000000000000900000035000000410000004d0000005900000065000000710000007d0000008900000095000000a3bb00b85904b700bb4da700a1bb00b85904b700bb4da70095bb00b85904b700bb4da70089bb00b85903b700bb4da7007dbb00b85904b700bb4da70071bb00b85903b700bb4da70065bb00b85904b700bb4da70059bb00b85903b700bb4da7004d2ab4005cb600bfc000b84da7003fbb00c1592ab40054b600c2c000c4b800c8b700cb12cdb600d12ab40052b600c2c000c4b600d112cdb600d12ab40056b600c2c000c4b600d1b600d54d2cb00000000100610000005a00160000007f0002008100380085004100860044008a004d008b0050008f00590090005c009400650095006800990071009a0074009e007d009f008000a3008900a4008c00a8009500a9009800ad00a300ae00a600b200e200ba000100d600b3000200b400000004000100b600260000015000030003000000e4014d1baa000000df000000000000000900000035000000410000004d0000005900000065000000710000007d0000008900000095000000a3bb00b85904b700bb4da700a1bb00b85904b700bb4da70095bb00b85904b700bb4da70089bb00b85903b700bb4da7007dbb00b85904b700bb4da70071bb00b85903b700bb4da70065bb00b85904b700bb4da70059bb00b85903b700bb4da7004d2ab4005cb600d9c000b84da7003fbb00c1592ab40054b600dac000c4b800c8b700cb12cdb600d12ab40052b600dac000c4b600d112cdb600d12ab40056b600dac000c4b600d1b600d54d2cb00000000100610000005a0016000000c3000200c5003800c9004100ca004400ce004d00cf005000d3005900d4005c00d8006500d9006800dd007100de007400e2007d00e3008000e7008900e8008c00ec009500ed009800f100a300f200a600f600e200fe000100db00b3000200b400000004000100b600260000015000030003000000e4014d1baa000000df000000000000000900000035000000410000004d0000005900000065000000710000007d0000008900000095000000a3bb00b85904b700bb4da700a1bb00b85904b700bb4da70095bb00b85904b700bb4da70089bb00b85903b700bb4da7007dbb00b85904b700bb4da70071bb00b85903b700bb4da70065bb00b85904b700bb4da70059bb00b85903b700bb4da7004d2ab4005cb600dec000b84da7003fbb00c1592ab40054b600c2c000c4b800c8b700cb12cdb600d12ab40052b600c2c000c4b600d112cdb600d12ab40056b600c2c000c4b600d1b600d54d2cb00000000100610000005a001600000107000201090038010d0041010e00440112004d01130050011700590118005c011c0065011d006801210071012200740126007d01270080012b0089012c008c0130009501310098013500a3013600a6013a00e20142000100df000000020001787571007e02ed00001bd7cafebabe0000002e012801001e67726f75704c6973745f313433333237383331303933305f31323438313307000101002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a524576616c7561746f72070003010017706172616d657465725f4a41535045525f5245504f52540100324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d657465723b01001a706172616d657465725f5245504f52545f54494d455f5a4f4e45010011706172616d657465725f73656d5965617201001e706172616d657465725f5245504f52545f46494c455f5245534f4c56455201001f706172616d657465725f5245504f52545f504152414d45544552535f4d4150010012706172616d657465725f67726f75704e756d010018706172616d657465725f5245504f52545f434f4e5445585401001d706172616d657465725f5245504f52545f434c4153535f4c4f4144455201001c706172616d657465725f5245504f52545f444154415f534f55524345010024706172616d657465725f5245504f52545f55524c5f48414e444c45525f464143544f525901001e706172616d657465725f49535f49474e4f52455f504147494e4154494f4e01001a706172616d657465725f5245504f52545f4d41585f434f554e5401001a706172616d657465725f5245504f52545f54454d504c41544553010017706172616d657465725f5245504f52545f4c4f43414c4501001c706172616d657465725f5245504f52545f5649525455414c495a4552010015706172616d657465725f534f52545f4649454c445301001a706172616d657465725f5245504f52545f5343524950544c4554010010706172616d657465725f73656d4e756d01001b706172616d657465725f5245504f52545f434f4e4e454354494f4e010010706172616d657465725f46494c544552010020706172616d657465725f4a41535045525f5245504f5254535f434f4e5445585401001f706172616d657465725f5245504f52545f464f524d41545f464143544f5259010010706172616d657465725f646567726565010013706172616d657465725f636f757273654e756d010020706172616d657465725f5245504f52545f5245534f555243455f42554e444c45010012706172616d657465725f73656d657374657201000d6669656c645f67726f7570496401002e4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c643b01000b6669656c645f73656d496401000e6669656c645f737065634e616d6501000d6669656c645f6661634e616d650100147661726961626c655f504147455f4e554d4245520100314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c653b0100167661726961626c655f434f4c554d4e5f4e554d4245520100157661726961626c655f5245504f52545f434f554e540100137661726961626c655f504147455f434f554e540100157661726961626c655f434f4c554d4e5f434f554e540100063c696e69743e010003282956010004436f64650c002b002c0a0004002e0c0005000609000200300c0007000609000200320c0008000609000200340c0009000609000200360c000a000609000200380c000b0006090002003a0c000c0006090002003c0c000d0006090002003e0c000e000609000200400c000f000609000200420c0010000609000200440c0011000609000200460c0012000609000200480c00130006090002004a0c00140006090002004c0c00150006090002004e0c0016000609000200500c0017000609000200520c0018000609000200540c0019000609000200560c001a000609000200580c001b0006090002005a0c001c0006090002005c0c001d0006090002005e0c001e000609000200600c001f000609000200620c0020002109000200640c0022002109000200660c0023002109000200680c00240021090002006a0c00250026090002006c0c00270026090002006e0c0028002609000200700c0029002609000200720c002a0026090002007401000f4c696e654e756d6265725461626c6501000e637573746f6d697a6564496e6974010030284c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b295601000a696e6974506172616d73010012284c6a6176612f7574696c2f4d61703b29560c0079007a0a0002007b01000a696e69744669656c64730c007d007a0a0002007e010008696e6974566172730c0080007a0a0002008101000d4a41535045525f5245504f525408008301000d6a6176612f7574696c2f4d6170070085010003676574010026284c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f4f626a6563743b0c008700880b008600890100306e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d6574657207008b0100105245504f52545f54494d455f5a4f4e4508008d01000773656d5965617208008f0100145245504f52545f46494c455f5245534f4c5645520800910100155245504f52545f504152414d45544552535f4d415008009301000867726f75704e756d08009501000e5245504f52545f434f4e544558540800970100135245504f52545f434c4153535f4c4f414445520800990100125245504f52545f444154415f534f5552434508009b01001a5245504f52545f55524c5f48414e444c45525f464143544f525908009d01001449535f49474e4f52455f504147494e4154494f4e08009f0100105245504f52545f4d41585f434f554e540800a10100105245504f52545f54454d504c415445530800a301000d5245504f52545f4c4f43414c450800a50100125245504f52545f5649525455414c495a45520800a701000b534f52545f4649454c44530800a90100105245504f52545f5343524950544c45540800ab01000673656d4e756d0800ad0100115245504f52545f434f4e4e454354494f4e0800af01000646494c5445520800b10100164a41535045525f5245504f5254535f434f4e544558540800b30100155245504f52545f464f524d41545f464143544f52590800b50100066465677265650800b7010009636f757273654e756d0800b90100165245504f52545f5245534f555243455f42554e444c450800bb01000873656d65737465720800bd01000767726f757049640800bf01002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c640700c101000573656d49640800c3010008737065634e616d650800c50100076661634e616d650800c701000b504147455f4e554d4245520800c901002f6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c650700cb01000d434f4c554d4e5f4e554d4245520800cd01000c5245504f52545f434f554e540800cf01000a504147455f434f554e540800d101000c434f4c554d4e5f434f554e540800d30100086576616c756174650100152849294c6a6176612f6c616e672f4f626a6563743b01000a457863657074696f6e730100136a6176612f6c616e672f5468726f7761626c650700d801000867657456616c756501001428294c6a6176612f6c616e672f4f626a6563743b0c00da00db0a008c00dc0100106a6176612f6c616e672f537472696e670700de0100022c200800e001000573706c6974010027284c6a6176612f6c616e672f537472696e673b295b4c6a6176612f6c616e672f537472696e673b0c00e200e30a00df00e40100116a6176612f6c616e672f496e74656765720700e6010004284929560c002b00e80a00e700e90100166a6176612f6c616e672f537472696e674275666665720700eb010014d0a4d0b0d0bad183d0bbd18cd182d0b5d1823a200800ed010015284c6a6176612f6c616e672f537472696e673b29560c002b00ef0a00ec00f00a00c200dc010006617070656e6401002c284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f537472696e674275666665723b0c00f300f40a00ec00f5010008746f537472696e6701001428294c6a6176612f6c616e672f537472696e673b0c00f700f80a00ec00f9010009d09ad183d180d181200800fb01000f2c20d0b3d180d183d0bfd0bfd0b0200800fd010001310800ff01000ed0bed181d0b5d0bdd0bdd0b8d0b9080101010010d0b2d0b5d181d0b5d0bdd0bdd0b8d0b908010301001020d181d0b5d0bcd0b5d181d182d18020080105010006636f6e636174010026284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f537472696e673b0c010701080a00df01090100012008010b0100012f08010d0a00e700f0010008696e7456616c75650100032829490c011001110a00e7011201000776616c75654f660100152849294c6a6176612f6c616e672f537472696e673b0c011401150a00df0116010009737562737472696e67010016284949294c6a6176612f6c616e672f537472696e673b0c011801190a00df011a01000920d183d1872ed0b32e08011c01001cd0a1d0bfd0b5d186d0b8d0b0d0bbd18cd0bdd0bed181d182d18c3a2008011e0100136a6176612f73716c2f436f6e6e656374696f6e07012001000b6576616c756174654f6c6401000b6765744f6c6456616c75650c012300db0a00c201240100116576616c75617465457374696d6174656401000a536f7572636546696c650021000200040000002300020005000600000002000700060000000200080006000000020009000600000002000a000600000002000b000600000002000c000600000002000d000600000002000e000600000002000f0006000000020010000600000002001100060000000200120006000000020013000600000002001400060000000200150006000000020016000600000002001700060000000200180006000000020019000600000002001a000600000002001b000600000002001c000600000002001d000600000002001e000600000002001f00060000000200200021000000020022002100000002002300210000000200240021000000020025002600000002002700260000000200280026000000020029002600000002002a0026000000080001002b002c0001002d0000015c00020001000000b42ab7002f2a01b500312a01b500332a01b500352a01b500372a01b500392a01b5003b2a01b5003d2a01b5003f2a01b500412a01b500432a01b500452a01b500472a01b500492a01b5004b2a01b5004d2a01b5004f2a01b500512a01b500532a01b500552a01b500572a01b500592a01b5005b2a01b5005d2a01b5005f2a01b500612a01b500632a01b500652a01b500672a01b500692a01b5006b2a01b5006d2a01b5006f2a01b500712a01b500732a01b50075b100000001007600000096002500000012000400190009001a000e001b0013001c0018001d001d001e0022001f00270020002c00210031002200360023003b00240040002500450026004a0027004f0028005400290059002a005e002b0063002c0068002d006d002e0072002f00770030007c00310081003200860033008b00340090003500950036009a0037009f003800a4003900a9003a00ae003b00b300120001007700780001002d0000003400020004000000102a2bb7007c2a2cb7007f2a2db70082b10000000100760000001200040000004700050048000a0049000f004a00020079007a0001002d0000025500030002000001d52a2b1284b9008a0200c0008cc0008cb500312a2b128eb9008a0200c0008cc0008cb500332a2b1290b9008a0200c0008cc0008cb500352a2b1292b9008a0200c0008cc0008cb500372a2b1294b9008a0200c0008cc0008cb500392a2b1296b9008a0200c0008cc0008cb5003b2a2b1298b9008a0200c0008cc0008cb5003d2a2b129ab9008a0200c0008cc0008cb5003f2a2b129cb9008a0200c0008cc0008cb500412a2b129eb9008a0200c0008cc0008cb500432a2b12a0b9008a0200c0008cc0008cb500452a2b12a2b9008a0200c0008cc0008cb500472a2b12a4b9008a0200c0008cc0008cb500492a2b12a6b9008a0200c0008cc0008cb5004b2a2b12a8b9008a0200c0008cc0008cb5004d2a2b12aab9008a0200c0008cc0008cb5004f2a2b12acb9008a0200c0008cc0008cb500512a2b12aeb9008a0200c0008cc0008cb500532a2b12b0b9008a0200c0008cc0008cb500552a2b12b2b9008a0200c0008cc0008cb500572a2b12b4b9008a0200c0008cc0008cb500592a2b12b6b9008a0200c0008cc0008cb5005b2a2b12b8b9008a0200c0008cc0008cb5005d2a2b12bab9008a0200c0008cc0008cb5005f2a2b12bcb9008a0200c0008cc0008cb500612a2b12beb9008a0200c0008cc0008cb50063b10000000100760000006e001b0000005200120053002400540036005500480056005a0057006c0058007e00590090005a00a2005b00b4005c00c6005d00d8005e00ea005f00fc0060010e00610120006201320063014400640156006501680066017a0067018c0068019e006901b0006a01c2006b01d4006c0002007d007a0001002d0000007100030002000000492a2b12c0b9008a0200c000c2c000c2b500652a2b12c4b9008a0200c000c2c000c2b500672a2b12c6b9008a0200c000c2c000c2b500692a2b12c8b9008a0200c000c2c000c2b5006bb1000000010076000000160005000000740012007500240076003600770048007800020080007a0001002d00000087000300020000005b2a2b12cab9008a0200c000ccc000ccb5006d2a2b12ceb9008a0200c000ccc000ccb5006f2a2b12d0b9008a0200c000ccc000ccb500712a2b12d2b9008a0200c000ccc000ccb500732a2b12d4b9008a0200c000ccc000ccb50075b10000000100760000001a00060000008000120081002400820036008300480084005a0085000100d500d6000200d700000004000100d9002d0000027c00050003000001d4014d1baa000001cf000000000000000f0000004d0000006200000077000000830000008f0000009b000000a7000000b3000000bf000000cb000000d7000000f40000018a000001a8000001b6000001c42ab40063b600ddc000df12e1b600e504324da701702ab40063b600ddc000df12e1b600e503324da7015bbb00e75904b700ea4da7014fbb00e75904b700ea4da70143bb00e75904b700ea4da70137bb00e75903b700ea4da7012bbb00e75904b700ea4da7011fbb00e75903b700ea4da70113bb00e75904b700ea4da70107bb00e75903b700ea4da700fbbb00ec5912eeb700f12ab4006bb600f2c000dfb600f6b600fa4da700debb00ec5912fcb700f12ab4005fb600ddc000dfb600f612feb600f62ab4003bb600ddc000dfb600f612e1b600f62ab40053b600ddc000df130100a60009130102a70006130104130106b6010ab600f613010cb600f62ab40035b600ddc000df13010eb6010abb00e7592ab40035b600ddc000dfb7010fb601130460b801170507b6011bb6010a13011db6010ab600f6b600fa4da70048bb00ec5913011fb700f12ab40069b600f2c000dfb600f6b600fa4da7002a2ab40055b600ddc001214da7001c2ab40065b600f2c000e74da7000e2ab40067b600f2c000e74d2cb00000000100760000009600250000008d0002008f00500093006200940065009800770099007a009d0083009e008600a2008f00a3009200a7009b00a8009e00ac00a700ad00aa00b100b300b200b600b600bf00b700c200bb00cb00bc00ce00c000d700c100da00c500f400c600f700ca012400cc014c00ce018600ca018a00cf018d00d301a800d401ab00d801b600d901b900dd01c400de01c700e201d200ea0001012200d6000200d700000004000100d9002d0000027c00050003000001d4014d1baa000001cf000000000000000f0000004d0000006200000077000000830000008f0000009b000000a7000000b3000000bf000000cb000000d7000000f40000018a000001a8000001b6000001c42ab40063b600ddc000df12e1b600e504324da701702ab40063b600ddc000df12e1b600e503324da7015bbb00e75904b700ea4da7014fbb00e75904b700ea4da70143bb00e75904b700ea4da70137bb00e75903b700ea4da7012bbb00e75904b700ea4da7011fbb00e75903b700ea4da70113bb00e75904b700ea4da70107bb00e75903b700ea4da700fbbb00ec5912eeb700f12ab4006bb60125c000dfb600f6b600fa4da700debb00ec5912fcb700f12ab4005fb600ddc000dfb600f612feb600f62ab4003bb600ddc000dfb600f612e1b600f62ab40053b600ddc000df130100a60009130102a70006130104130106b6010ab600f613010cb600f62ab40035b600ddc000df13010eb6010abb00e7592ab40035b600ddc000dfb7010fb601130460b801170507b6011bb6010a13011db6010ab600f6b600fa4da70048bb00ec5913011fb700f12ab40069b60125c000dfb600f6b600fa4da7002a2ab40055b600ddc001214da7001c2ab40065b60125c000e74da7000e2ab40067b60125c000e74d2cb0000000010076000000960025000000f3000200f5005000f9006200fa006500fe007700ff007a01030083010400860108008f01090092010d009b010e009e011200a7011300aa011700b3011800b6011c00bf011d00c2012100cb012200ce012600d7012700da012b00f4012c00f7013001240132014c013401860130018a0135018d013901a8013a01ab013e01b6013f01b9014301c4014401c7014801d201500001012600d6000200d700000004000100d9002d0000027c00050003000001d4014d1baa000001cf000000000000000f0000004d0000006200000077000000830000008f0000009b000000a7000000b3000000bf000000cb000000d7000000f40000018a000001a8000001b6000001c42ab40063b600ddc000df12e1b600e504324da701702ab40063b600ddc000df12e1b600e503324da7015bbb00e75904b700ea4da7014fbb00e75904b700ea4da70143bb00e75904b700ea4da70137bb00e75903b700ea4da7012bbb00e75904b700ea4da7011fbb00e75903b700ea4da70113bb00e75904b700ea4da70107bb00e75903b700ea4da700fbbb00ec5912eeb700f12ab4006bb600f2c000dfb600f6b600fa4da700debb00ec5912fcb700f12ab4005fb600ddc000dfb600f612feb600f62ab4003bb600ddc000dfb600f612e1b600f62ab40053b600ddc000df130100a60009130102a70006130104130106b6010ab600f613010cb600f62ab40035b600ddc000df13010eb6010abb00e7592ab40035b600ddc000dfb7010fb601130460b801170507b6011bb6010a13011db6010ab600f6b600fa4da70048bb00ec5913011fb700f12ab40069b600f2c000dfb600f6b600fa4da7002a2ab40055b600ddc001214da7001c2ab40065b600f2c000e74da7000e2ab40067b600f2c000e74d2cb0000000010076000000960025000001590002015b0050015f006201600065016400770165007a01690083016a0086016e008f016f00920173009b0174009e017800a7017900aa017d00b3017e00b6018200bf018300c2018700cb018800ce018c00d7018d00da019100f4019200f7019601240198014c019a01860196018a019b018d019f01a801a001ab01a401b601a501b901a901c401aa01c701ae01d201b6000101270000000200017400155f313433333237383331303933305f3132343831337400326e65742e73662e6a61737065727265706f7274732e656e67696e652e64657369676e2e4a524a61766163436f6d70696c6572);
+INSERT INTO `reports` (`id`, `file_name`, `descr`, `with_params`, `report`) VALUES
+INSERT INTO `reports` (`id`, `file_name`, `descr`, `with_params`, `report`) VALUES
+(13, 'chessWithIds.jasper', 'Аттестация (id)', 1, 0xaced0005737200286e65742e73662e6a61737065727265706f7274732e656e67696e652e4a61737065725265706f727400000000000027d80200034c000b636f6d70696c65446174617400164c6a6176612f696f2f53657269616c697a61626c653b4c0011636f6d70696c654e616d655375666669787400124c6a6176612f6c616e672f537472696e673b4c000d636f6d70696c6572436c61737371007e00027872002d6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173655265706f727400000000000027d802002a49001950534555444f5f53455249414c5f56455253494f4e5f55494449000c626f74746f6d4d617267696e49000b636f6c756d6e436f756e7449000d636f6c756d6e53706163696e6749000b636f6c756d6e57696474685a001069676e6f7265506167696e6174696f6e5a00136973466c6f6174436f6c756d6e466f6f7465725a0010697353756d6d6172794e6577506167655a0020697353756d6d6172795769746850616765486561646572416e64466f6f7465725a000e69735469746c654e65775061676549000a6c6566744d617267696e42000b6f7269656e746174696f6e49000a7061676548656967687449000970616765576964746842000a7072696e744f7264657249000b72696768744d617267696e490009746f704d617267696e42000e7768656e4e6f44617461547970654c000a6261636b67726f756e647400244c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5242616e643b4c000f636f6c756d6e446972656374696f6e7400334c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f52756e446972656374696f6e456e756d3b4c000c636f6c756d6e466f6f74657271007e00044c000c636f6c756d6e48656164657271007e00045b000864617461736574737400285b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52446174617365743b4c000c64656661756c745374796c657400254c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525374796c653b4c000664657461696c71007e00044c000d64657461696c53656374696f6e7400274c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5253656374696f6e3b4c0012666f726d6174466163746f7279436c61737371007e00024c000a696d706f72747353657474000f4c6a6176612f7574696c2f5365743b4c00086c616e677561676571007e00024c000e6c61737450616765466f6f74657271007e00044c000b6d61696e446174617365747400274c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52446174617365743b4c00046e616d6571007e00024c00066e6f4461746171007e00044c00106f7269656e746174696f6e56616c75657400324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4f7269656e746174696f6e456e756d3b4c000a70616765466f6f74657271007e00044c000a7061676548656164657271007e00044c000f7072696e744f7264657256616c75657400314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f5072696e744f72646572456e756d3b5b00067374796c65737400265b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525374796c653b4c000773756d6d61727971007e00045b000974656d706c6174657374002f5b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525265706f727454656d706c6174653b4c00057469746c6571007e00044c00137768656e4e6f446174615479706556616c75657400354c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f5768656e4e6f4461746154797065456e756d3b78700000c5460000001400000001000000000000032200000000000000001400000002530000034a000000001400000014007372002b6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736542616e6400000000000027d802000749001950534555444f5f53455249414c5f56455253494f4e5f5549444900066865696768745a000e697353706c6974416c6c6f7765644c00137072696e745768656e45787072657373696f6e74002a4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5245787072657373696f6e3b4c000d70726f706572746965734d617074002d4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5250726f706572746965734d61703b4c000973706c6974547970657400104c6a6176612f6c616e672f427974653b4c000e73706c69745479706556616c75657400304c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f53706c697454797065456e756d3b787200336e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365456c656d656e7447726f757000000000000027d80200024c00086368696c6472656e7400104c6a6176612f7574696c2f4c6973743b4c000c656c656d656e7447726f757074002c4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52456c656d656e7447726f75703b7870737200136a6176612e7574696c2e41727261794c6973747881d21d99c7619d03000149000473697a6578700000000077040000000078700000c54600000000017070707e72002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e53706c697454797065456e756d00000000000000001200007872000e6a6176612e6c616e672e456e756d00000000000000001200007870740007535452455443487e7200316e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e52756e446972656374696f6e456e756d00000000000000001200007871007e001d7400034c54527070757200285b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a52446174617365743b4c1a3698cdac9c440200007870000000027372002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173654461746173657400000000000027d802001149001950534555444f5f53455249414c5f56455253494f4e5f5549445a000669734d61696e4200177768656e5265736f757263654d697373696e67547970655b00066669656c64737400265b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a524669656c643b4c001066696c74657245787072657373696f6e71007e00125b000667726f7570737400265b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5247726f75703b4c00046e616d6571007e00025b000a706172616d657465727374002a5b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52506172616d657465723b4c000d70726f706572746965734d617071007e00134c000571756572797400254c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5251756572793b4c000e7265736f7572636542756e646c6571007e00024c000e7363726970746c6574436c61737371007e00025b000a7363726970746c65747374002a5b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525363726970746c65743b5b000a736f72744669656c647374002a5b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52536f72744669656c643b4c0004757569647400104c6a6176612f7574696c2f555549443b5b00097661726961626c65737400295b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525661726961626c653b4c001c7768656e5265736f757263654d697373696e675479706556616c756574003e4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f5768656e5265736f757263654d697373696e6754797065456e756d3b78700000c5460000757200265b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a524669656c643b023cdfc74e2af2700200007870000000087372002c6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173654669656c6400000000000027d80200054c000b6465736372697074696f6e71007e00024c00046e616d6571007e00024c000d70726f706572746965734d617071007e00134c000e76616c7565436c6173734e616d6571007e00024c001276616c7565436c6173735265616c4e616d6571007e000278707400007400084c6173744e616d657372002b6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5250726f706572746965734d617000000000000027d80200034c00046261736571007e00134c000e70726f706572746965734c69737471007e00174c000d70726f706572746965734d617074000f4c6a6176612f7574696c2f4d61703b78707070707400106a6176612e6c616e672e537472696e67707371007e003274000074000946697273744e616d657371007e00367070707400106a6176612e6c616e672e537472696e67707371007e003274000074000a5365636f6e644e616d657371007e00367070707400106a6176612e6c616e672e537472696e67707371007e003274000074000249447371007e00367070707400116a6176612e6c616e672e496e7465676572707371007e003274000074000b5375626a6563744e616d657371007e00367070707400106a6176612e6c616e672e537472696e67707371007e00327400007400084578616d547970657371007e00367070707400106a6176612e6c616e672e537472696e67707371007e003274000074000b72617465526567756c61727371007e00367070707400116a6176612e6c616e672e496e7465676572707371007e003270740007537562747970657371007e00367070707400106a6176612e6c616e672e537472696e6770707074000f63726f7373746162446174617365747572002a5b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a52506172616d657465723b22000c8d2ac36021020000787000000014737200306e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365506172616d6574657200000000000027d80200095a000e6973466f7250726f6d7074696e675a000f697353797374656d446566696e65644c001664656661756c7456616c756545787072657373696f6e71007e00124c000b6465736372697074696f6e71007e00024c00046e616d6571007e00024c000e6e6573746564547970654e616d6571007e00024c000d70726f706572746965734d617071007e00134c000e76616c7565436c6173734e616d6571007e00024c001276616c7565436c6173735265616c4e616d6571007e000278700101707074000e5245504f52545f434f4e54455854707371007e00367070707400296e65742e73662e6a61737065727265706f7274732e656e67696e652e5265706f7274436f6e74657874707371007e005f010170707400155245504f52545f504152414d45544552535f4d4150707371007e003670707074000d6a6176612e7574696c2e4d6170707371007e005f010170707400164a41535045525f5245504f5254535f434f4e54455854707371007e00367070707400306e65742e73662e6a61737065727265706f7274732e656e67696e652e4a61737065725265706f727473436f6e74657874707371007e005f0101707074000d4a41535045525f5245504f5254707371007e00367070707400286e65742e73662e6a61737065727265706f7274732e656e67696e652e4a61737065725265706f7274707371007e005f010170707400115245504f52545f434f4e4e454354494f4e707371007e00367070707400136a6176612e73716c2e436f6e6e656374696f6e707371007e005f010170707400105245504f52545f4d41585f434f554e54707371007e00367070707400116a6176612e6c616e672e496e7465676572707371007e005f010170707400125245504f52545f444154415f534f55524345707371007e00367070707400286e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5244617461536f75726365707371007e005f010170707400105245504f52545f5343524950544c4554707371007e003670707074002f6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5241627374726163745363726970746c6574707371007e005f0101707074000d5245504f52545f4c4f43414c45707371007e00367070707400106a6176612e7574696c2e4c6f63616c65707371007e005f010170707400165245504f52545f5245534f555243455f42554e444c45707371007e00367070707400186a6176612e7574696c2e5265736f7572636542756e646c65707371007e005f010170707400105245504f52545f54494d455f5a4f4e45707371007e00367070707400126a6176612e7574696c2e54696d655a6f6e65707371007e005f010170707400155245504f52545f464f524d41545f464143544f5259707371007e003670707074002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e7574696c2e466f726d6174466163746f7279707371007e005f010170707400135245504f52545f434c4153535f4c4f41444552707371007e00367070707400156a6176612e6c616e672e436c6173734c6f61646572707371007e005f0101707074001a5245504f52545f55524c5f48414e444c45525f464143544f5259707371007e00367070707400206a6176612e6e65742e55524c53747265616d48616e646c6572466163746f7279707371007e005f010170707400145245504f52545f46494c455f5245534f4c564552707371007e003670707074002d6e65742e73662e6a61737065727265706f7274732e656e67696e652e7574696c2e46696c655265736f6c766572707371007e005f010170707400105245504f52545f54454d504c41544553707371007e00367070707400146a6176612e7574696c2e436f6c6c656374696f6e707371007e005f0101707074000b534f52545f4649454c4453707371007e003670707074000e6a6176612e7574696c2e4c697374707371007e005f0101707074000646494c544552707371007e00367070707400296e65742e73662e6a61737065727265706f7274732e656e67696e652e4461746173657446696c746572707371007e005f0100707074000767726f75704964707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e005f0100707074000573656d4964707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e00367070707372002c6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365517565727900000000000027d80200025b00066368756e6b7374002b5b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5251756572794368756e6b3b4c00086c616e677561676571007e000278707572002b5b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5251756572794368756e6b3b409f00a1e8ba34a4020000787000000013737200316e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736551756572794368756e6b00000000000027d8020004420004747970654c00047465787471007e00024c000e746f6b656e536570617261746f727400154c6a6176612f6c616e672f4368617261637465723b5b0006746f6b656e737400135b4c6a6176612f6c616e672f537472696e673b7870017401ec0a202020202853454c4543542076732e4c6173744e616d65202c0a20202020202020202020202076732e46697273744e616d652c0a20202020202020202020202076732e5365636f6e644e616d652c0a202020202020202020202020766965775f6469736369706c696e65732e4469736369706c696e6549442020415320274944272c0a202020202020202020202020766965775f6469736369706c696e65732e5375626a6563744e616d652c0a202020202020202020202020766965775f6469736369706c696e65732e537562747970652c0a202020202020202020202020766965775f6469736369706c696e65732e4578616d547970652c0a20202020207672722e72617465526567756c61720a202020202020202046524f4d20606469736369706c696e65735f67726f757073600a2020202020202020494e4e4552204a4f494e2060766965775f6469736369706c696e657360204f4e20202020766965775f6469736369706c696e65732e4469736369706c696e654944203d206469736369706c696e65735f67726f7570732e4469736369706c696e65494420414e440a2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020766965775f6469736369706c696e65732e53656d65737465724944203d2070707371007e00b60274000573656d496470707371007e00b60174002e0a09096c656674206a6f696e20766965775f73747564656e7473207673206f6e2076732e67726f75704964203d2070707371007e00b60274000767726f7570496470707371007e00b60174001520616e642076732e73656d65737465724964203d2070707371007e00b60274000573656d496470707371007e00b6017400a90a202020202009206c656674206a6f696e20766965775f726174696e675f726573756c7420767272206f6e207672722e73747564656e746964203d2076732e73747564656e74696420616e64207672722e6469736369706c696e656964203d20766965775f6469736369706c696e65732e4469736369706c696e6549440a20202020202020205748455245206469736369706c696e65735f67726f7570732e47726f75704944203d2070707371007e00b60274000767726f7570496470707371007e00b60174024c0a202020202920554e494f4e2044495354494e43540a202020202853454c4543542076732e4c6173744e616d652c0a20202020202020202020202076732e46697273744e616d652c0a20202020202020202020202076732e5365636f6e644e616d652c0a202020202020202020202020766965775f6469736369706c696e65732e4469736369706c696e6549442020415320274944272c0a202020202020202020202020766965775f6469736369706c696e65732e5375626a6563744e616d652c0a202020202020202020202020766965775f6469736369706c696e65732e537562747970652c0a202020202020202020202020766965775f6469736369706c696e65732e4578616d547970652c0a20202020207672722e72617465526567756c61720a202020202020202046524f4d20606469736369706c696e65735f73747564656e7473600a2020202020202020494e4e4552204a4f494e206073747564656e747360204f4e206469736369706c696e65735f73747564656e74732e53747564656e744944203d2073747564656e74732e49440a2020202020202020494e4e4552204a4f494e2060766965775f6469736369706c696e657360204f4e20766965775f6469736369706c696e65732e4469736369706c696e654944203d206469736369706c696e65735f73747564656e74732e4469736369706c696e65494420414e440a2020202020202020202020202020202020202020202020202020202020202020202020202020202020766965775f6469736369706c696e65732e53656d65737465724944203d2070707371007e00b60274000573656d496470707371007e00b60174009a0a2020202020202020494e4e4552204a4f494e206073747564656e74735f67726f75707360204f4e2073747564656e74735f67726f7570732e53747564656e744944203d2073747564656e74732e494420414e440a2020202020202020202020202020202020202020202020202020202020202020202020202020202073747564656e74735f67726f7570732e53656d65737465724944203d2070707371007e00b60274000573656d496470707371007e00b60174002e0a09096c656674206a6f696e20766965775f73747564656e7473207673206f6e2076732e67726f75704964203d2070707371007e00b60274000767726f7570496470707371007e00b60174001520616e642076732e73656d65737465724964203d2070707371007e00b60274000573656d496470707371007e00b6017400a60a2020202020206c656674206a6f696e20766965775f726174696e675f726573756c7420767272206f6e207672722e73747564656e746964203d2076732e73747564656e7469642020616e64207672722e6469736369706c696e656964203d20766965775f6469736369706c696e65732e4469736369706c696e6549440a202020202020202057484552452073747564656e74735f67726f7570732e47726f75704944203d2070707371007e00b60274000767726f7570496470707371007e00b6017400580a20202020290a6f72646572206279204c6173744e616d652c0a20202020202020202020202046697273744e616d652c0a2020202020202020202020205365636f6e644e616d652c0a20202020202020202020202049440a707074000373716c707070707372000e6a6176612e7574696c2e55554944bc9903f7986d852f0200024a000c6c65617374536967426974734a000b6d6f7374536967426974737870b7ad74fc403f9f6f3e6bf0dc53764c15757200295b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a525661726961626c653b62e6837c982cb7440200007870000000057372002f6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173655661726961626c6500000000000027d802001149001950534555444f5f53455249414c5f56455253494f4e5f55494442000b63616c63756c6174696f6e42000d696e6372656d656e74547970655a000f697353797374656d446566696e65644200097265736574547970654c001063616c63756c6174696f6e56616c75657400324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f43616c63756c6174696f6e456e756d3b4c000a65787072657373696f6e71007e00124c000e696e6372656d656e7447726f75707400254c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5247726f75703b4c0012696e6372656d656e745479706556616c75657400344c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f496e6372656d656e7454797065456e756d3b4c001b696e6372656d656e746572466163746f7279436c6173734e616d6571007e00024c001f696e6372656d656e746572466163746f7279436c6173735265616c4e616d6571007e00024c0016696e697469616c56616c756545787072657373696f6e71007e00124c00046e616d6571007e00024c000a726573657447726f757071007e00e64c000e72657365745479706556616c75657400304c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f526573657454797065456e756d3b4c000e76616c7565436c6173734e616d6571007e00024c001276616c7565436c6173735265616c4e616d6571007e00027870000077ee000001007e7200306e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e43616c63756c6174696f6e456e756d00000000000000001200007871007e001d74000653595354454d70707e7200326e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e496e6372656d656e7454797065456e756d00000000000000001200007871007e001d7400044e4f4e457070737200316e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736545787072657373696f6e00000000000027d802000449000269645b00066368756e6b737400305b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5245787072657373696f6e4368756e6b3b4c000e76616c7565436c6173734e616d6571007e00024c001276616c7565436c6173735265616c4e616d6571007e0002787000000000757200305b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5245787072657373696f6e4368756e6b3b6d59cfde694ba355020000787000000001737200366e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736545787072657373696f6e4368756e6b00000000000027d8020002420004747970654c00047465787471007e00027870017400186e6577206a6176612e6c616e672e496e7465676572283129707074000b504147455f4e554d424552707e72002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e526573657454797065456e756d00000000000000001200007871007e001d7400065245504f525471007e0077707371007e00e4000077ee0000010071007e00eb707071007e00ee70707371007e00f0000000017571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e7465676572283129707074000d434f4c554d4e5f4e554d424552707e71007e00f97400045041474571007e0077707371007e00e4000077ee000001007e71007e00ea740005434f554e547371007e00f0000000027571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ee70707371007e00f0000000037571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e7465676572283029707074000c5245504f52545f434f554e547071007e00fa71007e0077707371007e00e4000077ee0000010071007e01057371007e00f0000000047571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ee70707371007e00f0000000057571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e7465676572283029707074000a504147455f434f554e547071007e010271007e0077707371007e00e4000077ee0000010071007e01057371007e00f0000000067571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ee70707371007e00f0000000077571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e7465676572283029707074000c434f4c554d4e5f434f554e54707e71007e00f9740006434f4c554d4e71007e0077707e72003c6e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e5768656e5265736f757263654d697373696e6754797065456e756d00000000000000001200007871007e001d7400044e554c4c7371007e00250000c54600007571007e0030000000037371007e003274000074000c4469736369706c696e6549447371007e00367070707400116a6176612e6c616e672e496e7465676572707371007e003274000074000b5375626a6563744e616d657371007e00367070707400106a6176612e6c616e672e537472696e67707371007e00327400007400084578616d547970657371007e00367070707400106a6176612e6c616e672e537472696e6770707074000b6c697374446174617365747571007e005d000000147371007e005f0101707071007e0061707371007e003670707071007e0063707371007e005f0101707071007e0065707371007e003670707071007e0067707371007e005f0101707071007e0069707371007e003670707071007e006b707371007e005f0101707071007e006d707371007e003670707071007e006f707371007e005f0101707071007e0071707371007e003670707071007e0073707371007e005f0101707071007e0075707371007e003670707071007e0077707371007e005f0101707071007e0079707371007e003670707071007e007b707371007e005f0101707071007e007d707371007e003670707071007e007f707371007e005f0101707071007e0081707371007e003670707071007e0083707371007e005f0101707071007e0085707371007e003670707071007e0087707371007e005f0101707071007e0089707371007e003670707071007e008b707371007e005f0101707071007e008d707371007e003670707071007e008f707371007e005f0101707071007e0091707371007e003670707071007e0093707371007e005f0101707071007e0095707371007e003670707071007e0097707371007e005f0101707071007e0099707371007e003670707071007e009b707371007e005f0101707071007e009d707371007e003670707071007e009f707371007e005f0101707071007e00a1707371007e003670707071007e00a3707371007e005f0101707071007e00a5707371007e003670707071007e00a7707371007e005f0100707074000767726f75704964707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e005f0100707074000573656d4964707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e00367070707371007e00b17571007e00b40000000b7371007e00b6017400c6280a202053454c4543540a2020202076642e4469736369706c696e6549442c0a2020202076642e5375626a6563744e616d652c0a2020202076642e4578616d547970650a202046524f4d0a20202020606469736369706c696e65735f67726f757073602064670a20202020494e4e4552204a4f494e2060766965775f6469736369706c696e657360207664204f4e202076642e4469736369706c696e654944203d2064672e4469736369706c696e65494420414e442076642e53656d65737465724944203d2070707371007e00b60274000573656d496470707371007e00b60174001a0a202057484552450a2020202064672e47726f75704944203d2070707371007e00b60274000767726f7570496470707371007e00b60174010c0a290a554e494f4e2044495354494e43540a280a202053454c4543540a2020202076642e4469736369706c696e6549442c0a2020202076642e5375626a6563744e616d652c0a2020202076642e4578616d547970650a202046524f4d0a20202020606469736369706c696e65735f73747564656e7473602064730a20202020494e4e4552204a4f494e206073747564656e7473602073204f4e2064732e53747564656e744944203d20732e49440a20202020494e4e4552204a4f494e2060766965775f6469736369706c696e657360207664204f4e2076642e4469736369706c696e654944203d2064732e4469736369706c696e65494420414e442076642e53656d65737465724944203d2070707371007e00b60274000573656d496470707371007e00b6017400500a20202020494e4e4552204a4f494e206073747564656e74735f67726f75707360207367204f4e2073672e53747564656e744944203d20732e494420414e442073672e53656d65737465724944203d2070707371007e00b60274000573656d496470707371007e00b60174001a0a202057484552450a2020202073672e47726f75704944203d2070707371007e00b60274000767726f7570496470707371007e00b60174001a0a290a6f726465722062790a20204469736369706c696e654944707074000373716c707070707371007e00e08ae3fbb130770e222fe3615473e947e37571007e00e2000000057371007e00e4000077ee0000010071007e00eb707071007e00ee70707371007e00f0000000007571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e7465676572283129707071007e00f87071007e00fa71007e0077707371007e00e4000077ee0000010071007e00eb707071007e00ee70707371007e00f0000000017571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e7465676572283129707071007e01017071007e010271007e0077707371007e00e4000077ee0000010071007e01057371007e00f0000000027571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ee70707371007e00f0000000037571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e7465676572283029707071007e010f7071007e00fa71007e0077707371007e00e4000077ee0000010071007e01057371007e00f0000000047571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ee70707371007e00f0000000057571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e7465676572283029707071007e01197071007e010271007e0077707371007e00e4000077ee0000010071007e01057371007e00f0000000067571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ee70707371007e00f0000000077571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e7465676572283029707071007e01237071007e012471007e00777071007e012770707372002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736553656374696f6e00000000000027d80200015b000562616e64737400255b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5242616e643b7870757200255b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5242616e643b95dd7eec8cca85350200007870000000017371007e00117371007e001a00000001770400000001737200326e65742e73662e6a61737065727265706f7274732e63726f7373746162732e626173652e4a524261736543726f737374616200000000000027d802001549001950534555444f5f53455249414c5f56455253494f4e5f554944490011636f6c756d6e427265616b4f666673657449000269645a0013726570656174436f6c756d6e486561646572735a0010726570656174526f774865616465727342000c72756e446972656374696f6e5b000563656c6c737400315b5b4c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f4a5243726f737374616243656c6c3b5b000c636f6c756d6e47726f7570737400375b4c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f4a5243726f7373746162436f6c756d6e47726f75703b4c0007646174617365747400324c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f4a5243726f7373746162446174617365743b4c000a68656164657243656c6c74002f4c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f4a5243656c6c436f6e74656e74733b4c0012686f72697a6f6e74616c506f736974696f6e7400354c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f486f72697a6f6e74616c506f736974696f6e3b4c000b69676e6f726557696474687400134c6a6176612f6c616e672f426f6f6c65616e3b4c00076c696e65426f787400274c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a524c696e65426f783b5b00086d656173757265737400335b4c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f4a5243726f73737461624d6561737572653b5b000a706172616d65746572737400355b4c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f4a5243726f7373746162506172616d657465723b4c0017706172616d65746572734d617045787072657373696f6e71007e00125b0009726f7747726f7570737400345b4c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f4a5243726f7373746162526f7747726f75703b4c001172756e446972656374696f6e56616c756571007e00054c00097469746c6543656c6c7400334c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f43726f7373746162436f6c756d6e43656c6c3b5b00097661726961626c657371007e002d4c000e7768656e4e6f4461746143656c6c71007e01b47872002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365456c656d656e7400000000000027d802001b49001950534555444f5f53455249414c5f56455253494f4e5f5549444900066865696768745a001769735072696e74496e466972737457686f6c6542616e645a001569735072696e74526570656174656456616c7565735a001a69735072696e745768656e44657461696c4f766572666c6f77735a0015697352656d6f76654c696e655768656e426c616e6b42000c706f736974696f6e5479706542000b7374726574636854797065490005776964746849000178490001794c00096261636b636f6c6f727400104c6a6176612f6177742f436f6c6f723b4c001464656661756c745374796c6550726f76696465727400344c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5244656661756c745374796c6550726f76696465723b4c000c656c656d656e7447726f757071007e00184c0009666f7265636f6c6f7271007e01bd4c00036b657971007e00024c00046d6f646571007e00144c00096d6f646556616c756574002b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4d6f6465456e756d3b4c000b706172656e745374796c6571007e00074c0018706172656e745374796c654e616d655265666572656e636571007e00024c0011706f736974696f6e5479706556616c75657400334c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f506f736974696f6e54797065456e756d3b4c00137072696e745768656e45787072657373696f6e71007e00124c00157072696e745768656e47726f75704368616e67657371007e00e64c000d70726f706572746965734d617071007e00135b001370726f706572747945787072657373696f6e737400335b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5250726f706572747945787072657373696f6e3b4c0010737472657463685479706556616c75657400324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f5374726574636854797065456e756d3b4c00047575696471007e002c78700000c5460000002f0001000000000000032200000000000000007071007e001071007e01ae7070707070707e7200316e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e506f736974696f6e54797065456e756d00000000000000001200007871007e001d7400134649585f52454c41544956455f544f5f544f50707070707e7200306e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e5374726574636854797065456e756d00000000000000001200007871007e001d74000a4e4f5f535452455443487371007e00e0b20ec12d9d3485cdda95ef9d42b94d1e0000c5460000000a00000000010100757200315b5b4c6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e4a5243726f737374616243656c6c3b3956bb3ca159754a020000787000000002757200305b4c6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e4a5243726f737374616243656c6c3b236e7b4a4c160e6a02000078700000000270737200366e65742e73662e6a61737065727265706f7274732e63726f7373746162732e626173652e4a524261736543726f737374616243656c6c00000000000027d80200054c0010636f6c756d6e546f74616c47726f757071007e00024c0008636f6e74656e747371007e01b44c00066865696768747400134c6a6176612f6c616e672f496e74656765723b4c000d726f77546f74616c47726f757071007e00024c0005776964746871007e01d0787070737200366e65742e73662e6a61737065727265706f7274732e63726f7373746162732e626173652e4a524261736543656c6c436f6e74656e747300000000000027d802000c49001950534555444f5f53455249414c5f56455253494f4e5f55494449000668656967687449000577696474684c00096261636b636f6c6f7271007e01bd4c0003626f787400234c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52426f783b4c001464656661756c745374796c6550726f766964657271007e01be4c00076c696e65426f7871007e01b74c00046d6f646571007e00144c00096d6f646556616c756571007e01bf4c000d70726f706572746965734d617071007e00134c00057374796c6571007e00074c00127374796c654e616d655265666572656e636571007e00027871007e00167371007e001a0000000077040000000078700000c54600000000000000327372000e6a6176612e6177742e436f6c6f7201a51783108f337502000546000666616c70686149000576616c75654c0002637374001b4c6a6176612f6177742f636f6c6f722f436f6c6f7253706163653b5b00096672676276616c75657400025b465b00066676616c756571007e01d8787000000000ffbfe1ff7070707071007e00107372002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173654c696e65426f7800000000000027d802000b4c000d626f74746f6d50616464696e6771007e01d04c0009626f74746f6d50656e74002b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f626173652f4a52426f7850656e3b4c000c626f78436f6e7461696e657274002c4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52426f78436f6e7461696e65723b4c000b6c65667450616464696e6771007e01d04c00076c65667450656e71007e01db4c000770616464696e6771007e01d04c000370656e71007e01db4c000c726967687450616464696e6771007e01d04c0008726967687450656e71007e01db4c000a746f7050616464696e6771007e01d04c0006746f7050656e71007e01db787070737200336e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365426f78426f74746f6d50656e00000000000027d80200007872002d6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365426f7850656e00000000000027d80200014c00076c696e65426f7871007e01b77872002a6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736550656e00000000000027d802000649001950534555444f5f53455249414c5f56455253494f4e5f5549444c00096c696e65436f6c6f7271007e01bd4c00096c696e655374796c6571007e00144c000e6c696e655374796c6556616c75657400304c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4c696e655374796c65456e756d3b4c00096c696e6557696474687400114c6a6176612f6c616e672f466c6f61743b4c000c70656e436f6e7461696e657274002c4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5250656e436f6e7461696e65723b78700000c5467070707071007e01dd71007e01dd71007e01d470737200316e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365426f784c65667450656e00000000000027d80200007871007e01df0000c5467070707071007e01dd71007e01dd707371007e01df0000c5467371007e01d600000000ff000000707070707e72002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e4c696e655374796c65456e756d00000000000000001200007871007e001d740005534f4c49447372000f6a6176612e6c616e672e466c6f6174daedc9a2db3cf0ec02000146000576616c7565787200106a6176612e6c616e672e4e756d62657286ac951d0b94e08b02000078703f00000071007e01dd71007e01dd70737200326e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365426f78526967687450656e00000000000027d80200007871007e01df0000c5467070707071007e01dd71007e01dd70737200306e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365426f78546f7050656e00000000000027d80200007871007e01df0000c5467070707071007e01dd71007e01dd707e7200296e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e4d6f6465456e756d00000000000000001200007871007e001d7400064f5041515545707070737200116a6176612e6c616e672e496e746567657212e2a0a4f781873802000149000576616c75657871007e01ed000000007400026c6e7371007e01f6000000327571007e01cd00000002707371007e01cf707371007e01d27371007e001a00000001770400000001737200306e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365546578744669656c6400000000000027d802001549001950534555444f5f53455249414c5f56455253494f4e5f55494449000d626f6f6b6d61726b4c6576656c42000e6576616c756174696f6e54696d6542000f68797065726c696e6b54617267657442000d68797065726c696e6b547970655a0015697353747265746368576974684f766572666c6f774c0014616e63686f724e616d6545787072657373696f6e71007e00124c000f6576616c756174696f6e47726f757071007e00e64c00136576616c756174696f6e54696d6556616c75657400354c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4576616c756174696f6e54696d65456e756d3b4c000a65787072657373696f6e71007e00124c001968797065726c696e6b416e63686f7245787072657373696f6e71007e00124c001768797065726c696e6b5061676545787072657373696f6e71007e00125b001368797065726c696e6b506172616d65746572737400335b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5248797065726c696e6b506172616d657465723b4c001c68797065726c696e6b5265666572656e636545787072657373696f6e71007e00124c001a68797065726c696e6b546f6f6c74697045787072657373696f6e71007e00124c001768797065726c696e6b5768656e45787072657373696f6e71007e00124c000f6973426c616e6b5768656e4e756c6c71007e01b64c000a6c696e6b54617267657471007e00024c00086c696e6b5479706571007e00024c00077061747465726e71007e00024c00117061747465726e45787072657373696f6e71007e0012787200326e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736554657874456c656d656e7400000000000027d802002649001950534555444f5f53455249414c5f56455253494f4e5f5549444c0006626f7264657271007e00144c000b626f72646572436f6c6f7271007e01bd4c000c626f74746f6d426f7264657271007e00144c0011626f74746f6d426f72646572436f6c6f7271007e01bd4c000d626f74746f6d50616464696e6771007e01d04c0008666f6e744e616d6571007e00024c0008666f6e7453697a6571007e01d04c0008666f6e7473697a6571007e01e24c0013686f72697a6f6e74616c416c69676e6d656e7471007e00144c0018686f72697a6f6e74616c416c69676e6d656e7456616c75657400364c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f486f72697a6f6e74616c416c69676e456e756d3b4c00066973426f6c6471007e01b64c000869734974616c696371007e01b64c000d6973506466456d62656464656471007e01b64c000f6973537472696b655468726f75676871007e01b64c000c69735374796c65645465787471007e01b64c000b6973556e6465726c696e6571007e01b64c000a6c656674426f7264657271007e00144c000f6c656674426f72646572436f6c6f7271007e01bd4c000b6c65667450616464696e6771007e01d04c00076c696e65426f7871007e01b74c000b6c696e6553706163696e6771007e00144c00106c696e6553706163696e6756616c75657400324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4c696e6553706163696e67456e756d3b4c00066d61726b757071007e00024c000770616464696e6771007e01d04c00097061726167726170687400294c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525061726167726170683b4c000b706466456e636f64696e6771007e00024c000b706466466f6e744e616d6571007e00024c000b7269676874426f7264657271007e00144c00107269676874426f72646572436f6c6f7271007e01bd4c000c726967687450616464696e6771007e01d04c0008726f746174696f6e71007e00144c000d726f746174696f6e56616c756574002f4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f526f746174696f6e456e756d3b4c0009746f70426f7264657271007e00144c000e746f70426f72646572436f6c6f7271007e01bd4c000a746f7050616464696e6771007e01d04c0011766572746963616c416c69676e6d656e7471007e00144c0016766572746963616c416c69676e6d656e7456616c75657400344c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f566572746963616c416c69676e456e756d3b7871007e01bc0000c546000000110001000000000000003200000000000000007071007e001071007e01fc707070707372002c6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173655374796c65000000000000271102003b49001950534555444f5f53455249414c5f56455253494f4e5f5549445a0009697344656661756c744c00096261636b636f6c6f7271007e01bd4c0006626f7264657271007e00144c000b626f72646572436f6c6f7271007e01bd4c000c626f74746f6d426f7264657271007e00144c0011626f74746f6d426f72646572436f6c6f7271007e01bd4c000d626f74746f6d50616464696e6771007e01d05b0011636f6e646974696f6e616c5374796c65737400315b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52436f6e646974696f6e616c5374796c653b4c001464656661756c745374796c6550726f766964657271007e01be4c000466696c6c71007e00144c000966696c6c56616c756574002b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f46696c6c456e756d3b4c0008666f6e744e616d6571007e00024c0008666f6e7453697a6571007e01d04c0008666f6e7473697a6571007e01e24c0009666f7265636f6c6f7271007e01bd4c0013686f72697a6f6e74616c416c69676e6d656e7471007e00144c0018686f72697a6f6e74616c416c69676e6d656e7456616c756571007e02024c000f6973426c616e6b5768656e4e756c6c71007e01b64c00066973426f6c6471007e01b64c000869734974616c696371007e01b64c000d6973506466456d62656464656471007e01b64c000f6973537472696b655468726f75676871007e01b64c000c69735374796c65645465787471007e01b64c000b6973556e6465726c696e6571007e01b64c000a6c656674426f7264657271007e00144c000f6c656674426f72646572436f6c6f7271007e01bd4c000b6c65667450616464696e6771007e01d04c00076c696e65426f7871007e01b74c00076c696e6550656e7400234c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5250656e3b4c000b6c696e6553706163696e6771007e00144c00106c696e6553706163696e6756616c756571007e02034c00066d61726b757071007e00024c00046d6f646571007e00144c00096d6f646556616c756571007e01bf4c00046e616d6571007e00024c000770616464696e6771007e01d04c000970617261677261706871007e02044c000b706172656e745374796c6571007e00074c0018706172656e745374796c654e616d655265666572656e636571007e00024c00077061747465726e71007e00024c000b706466456e636f64696e6771007e00024c000b706466466f6e744e616d6571007e00024c000370656e71007e00144c000c706f736974696f6e5479706571007e00144c000672616469757371007e01d04c000b7269676874426f7264657271007e00144c00107269676874426f72646572436f6c6f7271007e01bd4c000c726967687450616464696e6771007e01d04c0008726f746174696f6e71007e00144c000d726f746174696f6e56616c756571007e02054c000a7363616c65496d61676571007e00144c000f7363616c65496d61676556616c75657400314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f5363616c65496d616765456e756d3b4c000b737472657463685479706571007e00144c0009746f70426f7264657271007e00144c000e746f70426f72646572436f6c6f7271007e01bd4c000a746f7050616464696e6771007e01d04c0011766572746963616c416c69676e6d656e7471007e00144c0016766572746963616c416c69676e6d656e7456616c756571007e020678700000c546007070707070707070707070707070707e7200346e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e486f72697a6f6e74616c416c69676e456e756d00000000000000001200007871007e001d74000643454e544552707070707070707070707371007e01da707371007e01de0000c5467070707071007e021171007e021171007e020d707371007e01e50000c5467070707071007e021171007e0211707371007e01df0000c5467070707071007e021171007e0211707371007e01ef0000c5467070707071007e021171007e0211707371007e01f10000c5467070707071007e021171007e02117371007e01e00000c5467070707071007e020d707070707074001243726f73737461622044617461205465787470737200306e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736550617261677261706800000000000027d802000a4c000f66697273744c696e65496e64656e7471007e01d04c000a6c656674496e64656e7471007e01d04c000b6c696e6553706163696e6771007e02034c000f6c696e6553706163696e6753697a6571007e01e24c0012706172616772617068436f6e7461696e65727400324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52506172616772617068436f6e7461696e65723b4c000b7269676874496e64656e7471007e01d04c000c73706163696e67416674657271007e01d04c000d73706163696e674265666f726571007e01d04c000c74616253746f70576964746871007e01d04c000874616253746f707371007e001778707070707071007e020d70707070707070707070707070707070707070707070707070707071007e01c57070707071007e01c87371007e00e09be9775ea58520c5690c23d5d68843750000c5467070707070740005417269616c707070707070707070707070707371007e01da707371007e01de0000c5467070707071007e021e71007e021e71007e0207707371007e01e50000c5467070707071007e021e71007e021e707371007e01df0000c5467070707071007e021e71007e021e707371007e01ef0000c5467070707071007e021e71007e021e707371007e01f10000c5467070707071007e021e71007e021e707070707371007e02197070707071007e0207707070707070707070707070707070707e7200326e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e566572746963616c416c69676e456e756d00000000000000001200007871007e001d7400064d4944444c450000c546000000000000000070707e7200336e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e4576616c756174696f6e54696d65456e756d00000000000000001200007871007e001d7400034e4f577371007e00f0000000027571007e00f3000000057371007e00f50474000b726174654d6561737572657371007e00f50174000c203d3d206e756c6c207c7c207371007e00f50474000b726174654d6561737572657371007e00f50174000d203c2030203f20222d22203a207371007e00f50474000b726174654d6561737572657070707070707070707070707078700000c5460000001100000032707071007e00107371007e01da707371007e01de0000c5467070707071007e023771007e023771007e01fc707371007e01e50000c5467070707071007e023771007e0237707371007e01df0000c5467371007e01d600000000ff0000007070707071007e01ea7371007e01ec3f00000071007e023771007e0237707371007e01ef0000c5467070707071007e023771007e0237707371007e01f10000c5467070707071007e023771007e023770707070707371007e01f6000000117071007e01f9757200375b4c6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e4a5243726f7373746162436f6c756d6e47726f75703bcd9b5e4c263f69320200007870000000017372003d6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e626173652e4a524261736543726f7373746162436f6c756d6e47726f757000000000000027d802000549001950534555444f5f53455249414c5f56455253494f4e5f554944490006686569676874420008706f736974696f6e4c000e63726f737374616248656164657271007e01b44c000d706f736974696f6e56616c75657400404c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f747970652f43726f7373746162436f6c756d6e506f736974696f6e456e756d3b787200376e65742e73662e6a61737065727265706f7274732e63726f7373746162732e626173652e4a524261736543726f737374616247726f75706aa6a7928edd3f6502000849001950534555444f5f53455249414c5f56455253494f4e5f55494442000d746f74616c506f736974696f6e4c00066275636b65747400314c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f4a5243726f73737461624275636b65743b4c000668656164657271007e01b44c00046e616d6571007e00024c000b746f74616c48656164657271007e01b44c0012746f74616c506f736974696f6e56616c756574003f4c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f747970652f43726f7373746162546f74616c506f736974696f6e456e756d3b4c00087661726961626c657400284c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525661726961626c653b78700000c54600737200386e65742e73662e6a61737065727265706f7274732e63726f7373746162732e626173652e4a524261736543726f73737461624275636b657400000000000027d802000a49001950534555444f5f53455249414c5f56455253494f4e5f5549444200056f726465724c000b6275636b65744f7264657274003b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f616e616c79746963732f646174617365742f4275636b65744f726465723b4c0014636f6d70617261746f7245787072657373696f6e71007e00124c000a65787072657373696f6e71007e00124c00116f72646572427945787072657373696f6e71007e00124c000a6f7264657256616c75657400304c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f536f72744f72646572456e756d3b4c000a76616c7565436c6173737400114c6a6176612f6c616e672f436c6173733b4c000e76616c7565436c6173734e616d6571007e00024c001276616c7565436c6173735265616c4e616d6571007e000278700000c546007e7200396e65742e73662e6a61737065727265706f7274732e656e67696e652e616e616c79746963732e646174617365742e4275636b65744f7264657200000000000000001200007871007e001d740009415343454e44494e47707371007e00f0000000097571007e00f3000000017371007e00f50374000249447070707e72002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e536f72744f72646572456e756d00000000000000001200007871007e001d740009415343454e44494e47707400116a6176612e6c616e672e496e7465676572707371007e01d27371007e001a000000017704000000017371007e01fe0000c5460000001e0001000000000000003200000000000000007071007e001071007e02597070707071007e020d7071007e01c57070707071007e01c87371007e00e08a0d1306e2cd8cfb391c1d27b0924fc20000c546707070707070707070707070707070707070707371007e01da707371007e01de0000c5467070707371007e01ec3f00000071007e025d71007e025d71007e025b707371007e01e50000c5467070707371007e01ec3f00000071007e025d71007e025d707371007e01df0000c5467070707071007e025d71007e025d707371007e01ef0000c5467070707371007e01ec3f00000071007e025d71007e025d707371007e01f10000c5467070707371007e01ec3f00000071007e025d71007e025d707070707371007e02197070707071007e025b7070707070707070707070707070707071007e02260000c5460000000000000000707071007e02297371007e00f0000000017571007e00f3000000017371007e00f50474000269647070707070707070707070707078700000c5460000001e00000032707071007e00107371007e01da707371007e01de0000c5467070707071007e026c71007e026c71007e0259707371007e01e50000c5467070707071007e026c71007e026c707371007e01df0000c5467070707071007e026c71007e026c707371007e01ef0000c5467070707071007e026c71007e026c707371007e01f10000c5467070707071007e026c71007e026c707070707074000269647371007e01d27371007e001a0000000077040000000078700000c5468000000080000000707071007e00107371007e01da707371007e01de0000c5467070707071007e027571007e027571007e0273707371007e01e50000c5467070707071007e027571007e0275707371007e01df0000c5467070707071007e027571007e0275707371007e01ef0000c5467070707071007e027571007e0275707371007e01f10000c5467070707071007e027571007e027570707070707e72003d6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e747970652e43726f7373746162546f74616c506f736974696f6e456e756d00000000000000001200007871007e001d7400044e4f4e457371007e00e4000077ee0000010071007e00eb707071007e00ee70707071007e02727071007e00fa71007e0258700000c5460000001e00707e72003e6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e747970652e43726f7373746162436f6c756d6e506f736974696f6e456e756d00000000000000001200007871007e001d7400044c454654737200396e65742e73662e6a61737065727265706f7274732e63726f7373746162732e626173652e4a524261736543726f73737461624461746173657400000000000027d80200015a000d64617461507265536f72746564787200356e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365456c656d656e744461746173657400000000000027d802000949001950534555444f5f53455249414c5f56455253494f4e5f55494442000d696e6372656d656e74547970654200097265736574547970654c000a6461746173657452756e74002a4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a524461746173657452756e3b4c000e696e6372656d656e7447726f757071007e00e64c0012696e6372656d656e745479706556616c756571007e00e74c0017696e6372656d656e745768656e45787072657373696f6e71007e00124c000a726573657447726f757071007e00e64c000e72657365745479706556616c756571007e00e87870000077ee0000737200316e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173654461746173657452756e00000000000027d80200084c0014636f6e6e656374696f6e45787072657373696f6e71007e00124c001464617461536f7572636545787072657373696f6e71007e00124c000b646174617365744e616d6571007e00025b000a706172616d65746572737400315b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5244617461736574506172616d657465723b4c0017706172616d65746572734d617045787072657373696f6e71007e00124c000d70726f706572746965734d617071007e00134c000c72657475726e56616c75657371007e00174c00047575696471007e002c78707371007e00f00000000d7571007e00f3000000017371007e00f5027400115245504f52545f434f4e4e454354494f4e70707074000f63726f7373746162446174617365747572003a5b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736544617461736574506172616d657465723b2413b76c659575a5020000787000000002737200376e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736544617461736574506172616d6574657200000000000027d80200024c000a65787072657373696f6e71007e00124c00046e616d6571007e000278707371007e00f00000000e7571007e00f3000000017371007e00f50374000767726f75704964707074000767726f757049647371007e02907371007e00f00000000f7571007e00f3000000017371007e00f50374000573656d4964707074000573656d49647070707371007e00e0903506ad280ed63a2a010b261e9e41687071007e00ee707071007e00fa007371007e01d27371007e001a000000037704000000037372002b6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173654c696e6500000000000027d802000349001950534555444f5f53455249414c5f56455253494f4e5f554944420009646972656374696f6e4c000e646972656374696f6e56616c75657400344c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4c696e65446972656374696f6e456e756d3b787200356e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736547726170686963456c656d656e7400000000000027d802000549001950534555444f5f53455249414c5f56455253494f4e5f5549444c000466696c6c71007e00144c000966696c6c56616c756571007e020a4c00076c696e6550656e71007e020b4c000370656e71007e00147871007e01bc0000c5460000001e0001000000000000006900000000000000007071007e001071007e029e7070707071007e020d7071007e01c57070707071007e01c87371007e00e09ec3bf24d381d93a359c07b13c354558000077ee70707371007e01e00000c5467070707071007e02a3700000c546007e7200326e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e4c696e65446972656374696f6e456e756d00000000000000001200007871007e001d740008544f505f444f574e737200316e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173655374617469635465787400000000000027d80200014c00047465787471007e00027871007e02010000c5460000000f0001000000000000006900000000000000007071007e001071007e029e7070707071007e020d7071007e01c57070707071007e01c87371007e00e0bbd29fdbaf9f78306f97116d404445260000c5467070707070740005417269616c707371007e01ec41200000707e71007e020e74000552494748547070707070707070707371007e01da707371007e01de0000c5467070707071007e02b071007e02b071007e02aa707371007e01e50000c5467070707371007e01ec3f00000071007e02b071007e02b0707371007e01df0000c5467070707071007e02b071007e02b07371007e01f6000000017371007e01ef0000c5467070707071007e02b071007e02b0707371007e01f10000c5467070707371007e01ec3f00000071007e02b071007e02b0707070707371007e02197070707071007e02aa7070707070707070707070707070707071007e0226740014d094d0b8d181d186d0b8d0bfd0bbd0b8d0bdd18b7371007e02a90000c5460000000f00010000000000000069000000000000000f7071007e001071007e029e7070707071007e020d7071007e01c57070707071007e01c87371007e00e09c8e5ede8c60f3d28b258f960d324dde0000c5467070707070740005417269616c707371007e01ec41200000707e71007e020e7400044c4546547070707070707070707371007e01da707371007e01de0000c5467070707071007e02c171007e02c171007e02bb7371007e01f6000000037371007e01e50000c5467070707371007e01ec3f00000071007e02c171007e02c1707371007e01df0000c5467070707071007e02c171007e02c1707371007e01ef0000c5467070707071007e02c171007e02c1707371007e01f10000c5467070707071007e02c171007e02c1707070707371007e02197070707071007e02bb7070707070707070707070707070707071007e0226740009d0a42ed0982ed09e2e78700000c5460000001e00000069707071007e00107371007e01da707371007e01de0000c5467070707071007e02cb71007e02cb71007e029e707371007e01e50000c5467070707071007e02cb71007e02cb707371007e01df0000c5467070707071007e02cb71007e02cb707371007e01ef0000c5467070707071007e02cb71007e02cb707371007e01f10000c5467070707071007e02cb71007e02cb707070707070737200116a6176612e6c616e672e426f6f6c65616ecd207280d59cfaee0200015a000576616c75657870007371007e01da71007e01f77371007e01de0000c5467070707071007e02d371007e02d371007e01c371007e01f77371007e01e50000c5467070707071007e02d371007e02d3707371007e01df0000c5467070707071007e02d371007e02d371007e01f77371007e01ef0000c5467070707071007e02d371007e02d371007e01f77371007e01f10000c5467070707071007e02d371007e02d3757200335b4c6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e4a5243726f73737461624d6561737572653b2f9461b264b12588020000787000000001737200396e65742e73662e6a61737065727265706f7274732e63726f7373746162732e626173652e4a524261736543726f73737461624d65617375726500000000000027d802001149001950534555444f5f53455249414c5f56455253494f4e5f55494442000b63616c63756c6174696f6e42001070657263656e746167654f66547970654c001063616c63756c6174696f6e56616c756571007e00e54c000a65787072657373696f6e71007e00124c0017696e6372656d656e746572466163746f7279436c61737371007e024c4c001b696e6372656d656e746572466163746f7279436c6173734e616d6571007e00024c001f696e6372656d656e746572466163746f7279436c6173735265616c4e616d6571007e00024c00046e616d6571007e00024c001970657263656e7461676543616c63756c61746f72436c61737371007e024c4c001d70657263656e7461676543616c63756c61746f72436c6173734e616d6571007e00024c002170657263656e7461676543616c63756c61746f72436c6173735265616c4e616d6571007e00024c000e70657263656e746167655479706574003c4c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f747970652f43726f737374616250657263656e74616765456e756d3b4c000a76616c7565436c61737371007e024c4c000e76616c7565436c6173734e616d6571007e00024c001276616c7565436c6173735265616c4e616d6571007e00024c00087661726961626c6571007e024778700000c54600007e71007e00ea7400074e4f5448494e477371007e00f00000000a7571007e00f3000000017371007e00f50374000b72617465526567756c6172707070707074000b726174654d6561737572657070707e72003a6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e747970652e43726f737374616250657263656e74616765456e756d00000000000000001200007871007e001d7400044e4f4e45707400116a6176612e6c616e672e496e7465676572707371007e00e4000077ee0000010071007e00eb707071007e00ee70707071007e02e47071007e00fa71007e02e870757200355b4c6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e4a5243726f7373746162506172616d657465723bebb3be7dace371a60200007870000000097372003b6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e626173652e4a524261736543726f7373746162506172616d6574657200000000000027d80200014c000f76616c756545787072657373696f6e71007e00127871007e005f0101707071007e0061707371007e003670707071007e006370707371007e02ec0101707071007e0065707371007e003670707071007e006770707371007e02ec0101707071007e0081707371007e003670707071007e008370707371007e02ec0101707071007e0085707371007e003670707071007e008770707371007e02ec0101707071007e0089707371007e003670707071007e008b70707371007e02ec0101707071007e008d707371007e003670707071007e008f70707371007e02ec0101707071007e0091707371007e003670707071007e009370707371007e02ec0101707071007e0095707371007e003670707071007e009770707371007e02ec0101707071007e0099707371007e003670707071007e009b707070757200345b4c6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e4a5243726f7373746162526f7747726f75703bb7ef2732ac341dbd0200007870000000017372003a6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e626173652e4a524261736543726f7373746162526f7747726f757000000000000027d802000449001950534555444f5f53455249414c5f56455253494f4e5f554944420008706f736974696f6e49000577696474684c000d706f736974696f6e56616c756574003d4c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f747970652f43726f7373746162526f77506f736974696f6e456e756d3b7871007e02440000c546007371007e02490000c5460071007e024f707371007e00f0000000087571007e00f30000000e7371007e00f5037400084c6173744e616d657371007e00f50174000b202b20222022202b0a28287371007e00f50374000946697273744e616d657371007e00f50174000c203d3d206e756c6c207c7c207371007e00f50374000946697273744e616d657371007e00f5017400142e6973456d707479282929203f202222203a20287371007e00f50374000946697273744e616d657371007e00f50174001d2e737562737472696e6728302c203129202b20222e222929202b0a28287371007e00f50374000a5365636f6e644e616d657371007e00f50174000c203d3d206e756c6c207c7c207371007e00f50374000a5365636f6e644e616d657371007e00f5017400142e6973456d707479282929203f202222203a20287371007e00f50374000a5365636f6e644e616d657371007e00f5017400182e737562737472696e6728302c203129202b20222e22292970707071007e0256707400106a6176612e6c616e672e537472696e67707371007e01d27371007e001a000000017704000000017371007e01fe0000c546000000110001000000000000006900000000000000007071007e001071007e03247070707071007e020d7071007e01c57070707071007e01c87371007e00e0ac4ddd0e461a9ac2f9e31690e1a243910000c5467070707070740005417269616c70707071007e02bf7070707070707070707371007e01da707371007e01de0000c5467070707071007e032971007e032971007e032671007e02c37371007e01e50000c5467070707071007e032971007e0329707371007e01df0000c5467070707071007e032971007e0329707371007e01ef0000c5467070707071007e032971007e0329707371007e01f10000c5467070707071007e032971007e0329707070707371007e02197070707071007e03267070707070707070707070707070707071007e02260000c5460000000000000000707071007e02297371007e00f0000000007571007e00f3000000017371007e00f5047400026c6e7070707070707070707070707078700000c54600000011000000697371007e01d600000000ffffffff7070707071007e00107371007e01da707371007e01de0000c5467070707071007e033571007e033571007e0324707371007e01e50000c5467070707071007e033571007e0335707371007e01df0000c5467371007e01d600000000ff0000007070707071007e01ea7371007e01ec3f00000071007e033571007e0335707371007e01ef0000c5467070707071007e033571007e0335707371007e01f10000c5467070707071007e033571007e03357071007e01f47070707400026c6e7371007e01d27371007e001a0000000077040000000078700000c54600000000000000697371007e01d600000000ffbfe1ff7070707071007e00107371007e01da707371007e01de0000c5467070707071007e034171007e034171007e033e707371007e01e50000c5467070707071007e034171007e0341707371007e01df0000c5467371007e01d600000000ff0000007070707071007e01ea7371007e01ec3f00000071007e034171007e0341707371007e01ef0000c5467070707071007e034171007e0341707371007e01f10000c5467070707071007e034171007e03417071007e01f47070707e71007e027b740003454e447371007e00e4000077ee0000010071007e00eb707071007e00ee70707071007e033d7071007e00fa71007e0323700000c54600000000697e72003b6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e747970652e43726f7373746162526f77506f736974696f6e456e756d00000000000000001200007871007e001d740003544f5071007e0021707571007e00e2000000087371007e00e4000077ee0000010071007e00eb707071007e00ee707070740009524f575f434f554e547071007e00fa71007e0077707371007e00e4000077ee0000010071007e00eb707071007e00ee70707071007e01237071007e00fa71007e00777071007e034b71007e027e71007e02e97371007e00e4000077ee0000010071007e00eb707071007e00ee707070740012726174654d6561737572655f69645f414c4c7071007e00fa71007e02e8707371007e00e4000077ee0000010071007e00eb707071007e00ee707070740012726174654d6561737572655f6c6e5f414c4c7071007e00fa71007e02e8707371007e00e4000077ee0000010071007e00eb707071007e00ee707070740015726174654d6561737572655f6c6e5f69645f414c4c7071007e00fa71007e02e8707078700000c5460000002f0170707071007e001e70707400046a617661707371007e00250000c54601007571007e0030000000047371007e00327074000767726f757049647371007e00367070707400116a6176612e6c616e672e496e7465676572707371007e003270740008737065634e616d657371007e00367070707400106a6176612e6c616e672e537472696e67707371007e0032707400076661634e616d657371007e00367070707400106a6176612e6c616e672e537472696e67707371007e00327074000573656d49647371007e00367070707400116a6176612e6c616e672e496e746567657270707074000c6368657373576974684964737571007e005d0000001a7371007e005f0101707071007e0061707371007e003670707071007e0063707371007e005f0101707071007e0065707371007e003670707071007e0067707371007e005f0101707071007e0069707371007e003670707071007e006b707371007e005f0101707071007e006d707371007e003670707071007e006f707371007e005f0101707071007e0071707371007e003670707071007e0073707371007e005f0101707071007e0075707371007e003670707071007e0077707371007e005f0101707071007e0079707371007e003670707071007e007b707371007e005f0101707071007e007d707371007e003670707071007e007f707371007e005f0101707071007e0081707371007e003670707071007e0083707371007e005f0101707071007e0085707371007e003670707071007e0087707371007e005f0101707071007e0089707371007e003670707071007e008b707371007e005f0101707071007e008d707371007e003670707071007e008f707371007e005f0101707071007e0091707371007e003670707071007e0093707371007e005f0101707071007e0095707371007e003670707071007e0097707371007e005f0101707071007e0099707371007e003670707071007e009b707371007e005f0101707071007e009d707371007e003670707071007e009f707371007e005f0101707071007e00a1707371007e003670707071007e00a3707371007e005f0101707071007e00a5707371007e003670707071007e00a7707371007e005f010170707400125245504f52545f5649525455414c495a4552707371007e00367070707400296e65742e73662e6a61737065727265706f7274732e656e67696e652e4a525669727475616c697a6572707371007e005f0101707074001449535f49474e4f52455f504147494e4154494f4e707371007e00367070707400116a6176612e6c616e672e426f6f6c65616e707371007e005f0100707074000867726f75704e756d707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e005f01007070740009636f757273654e756d707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e005f01007070740006646567726565707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e005f0100707074000873656d6573746572707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e005f01007371007e00f0000000007571007e00f3000000027371007e00f50274000873656d65737465727371007e00f5017400112e73706c69742820222c202220295b315d70707074000673656d4e756d707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e005f01007371007e00f0000000017571007e00f3000000027371007e00f50274000873656d65737465727371007e00f5017400102e73706c69742820222c2022295b305d70707074000773656d59656172707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e0036707371007e001a0000000377040000000374000c697265706f72742e7a6f6f6d740009697265706f72742e78740009697265706f72742e7978737200116a6176612e7574696c2e486173684d61700507dac1c31660d103000246000a6c6f6164466163746f724900097468726573686f6c6478703f400000000000037708000000040000000371007e03c27400013071007e03c0740003312e3571007e03c174000130787371007e00b17571007e00b40000000a7371007e00b60174006973656c6563740a09735f672e49642061732067726f757049642c20732e6e616d6520617320737065634e616d652c20662e6e616d65206173206661634e616d652c202873656c6563742069642066726f6d2073656d657374657273207768657265206079656172603d70707371007e00b60274000773656d5965617270707371007e00b60174000920616e64206e756d3d70707371007e00b60274000673656d4e756d70707371007e00b6017400c4292061732073656d49640a66726f6d0a0973747564795f67726f75707320735f670a202020206a6f696e206772616465732067206f6e20735f672e67726164654964203d20672e69640a202020206a6f696e207370656369616c697a6174696f6e732073206f6e20735f672e7370656369616c697a6174696f6e4964203d20732e69640a202020206a6f696e20666163756c746965732066206f6e20732e666163756c74794964203d20662e69640a776865726520735f672e47726f75704e756d203d2070707371007e00b60274000867726f75704e756d70707371007e00b60174000d20616e6420672e4e756d203d2070707371007e00b602740009636f757273654e756d70707371007e00b60174001d20616e6420662e4944203d203120616e6420672e646567726565203d2070707371007e00b602740006646567726565707071007e0181707070707371007e00e094efc263d1c86e9954aa3831a12748d17571007e00e2000000057371007e00e4000077ee0000010071007e00eb707071007e00ee70707371007e00f0000000027571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e7465676572283129707071007e00f87071007e00fa71007e0077707371007e00e4000077ee0000010071007e00eb707071007e00ee70707371007e00f0000000037571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e7465676572283129707071007e01017071007e010271007e0077707371007e00e4000077ee0000010071007e01057371007e00f0000000047571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ee70707371007e00f0000000057571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e7465676572283029707071007e010f7071007e00fa71007e0077707371007e00e4000077ee0000010071007e01057371007e00f0000000067571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ee70707371007e00f0000000077571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e7465676572283029707071007e01197071007e010271007e0077707371007e00e4000077ee0000010071007e01057371007e00f0000000087571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ee70707371007e00f0000000097571007e00f3000000017371007e00f5017400186e6577206a6176612e6c616e672e496e7465676572283029707071007e01237071007e012471007e00777071007e012771007e036c707e7200306e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e4f7269656e746174696f6e456e756d00000000000000001200007871007e001d7400094c414e44534341504570707e72002f6e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e5072696e744f72646572456e756d00000000000000001200007871007e001d740008564552544943414c757200265b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a525374796c653bd49cc311d905723502000078700000000171007e020d7371007e00117371007e001a00000001770400000001737200376e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365436f6d706f6e656e74456c656d656e7400000000000027d80200024c0009636f6d706f6e656e747400314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f636f6d706f6e656e742f436f6d706f6e656e743b4c000c636f6d706f6e656e744b65797400344c6e65742f73662f6a61737065727265706f7274732f656e67696e652f636f6d706f6e656e742f436f6d706f6e656e744b65793b7871007e01bc0000c546000000140001000000000000032200000000000000007071007e001071007e040d70707070707071007e01c57070707071007e01c87371007e00e0bd4b3cd9d8a2a073cb04fac22ddf4d7c7372003a6e65742e73662e6a61737065727265706f7274732e636f6d706f6e656e74732e6c6973742e5374616e646172644c697374436f6d706f6e656e74000000000000000102000649001950534555444f5f53455249414c5f56455253494f4e5f5549444c0008636f6e74656e74737400334c6e65742f73662f6a61737065727265706f7274732f636f6d706f6e656e74732f6c6973742f4c697374436f6e74656e74733b4c000a6461746173657452756e71007e02844c000b69676e6f7265576964746871007e01b64c000a7072696e744f7264657271007e00144c000f7072696e744f7264657256616c756571007e000c78700000c546737200356e65742e73662e6a61737065727265706f7274732e636f6d706f6e656e74732e6c6973742e426173654c697374436f6e74656e747300000000000000010200024900066865696768744c0005776964746871007e01d07871007e00167371007e001a000000037704000000037371007e01fe0000c546000000140001000000000000001900000000000000007071007e001071007e041870707070707071007e01c57070707071007e01c87371007e00e082b1b2a75cbf64b4ff8fefc5c72243490000c5467070707070740005417269616c707070707070707070707070707371007e01da707371007e01de0000c5467070707071007e041d71007e041d71007e041a707371007e01e50000c5467070707071007e041d71007e041d707371007e01df0000c5467070707071007e041d71007e041d707371007e01ef0000c5467070707071007e041d71007e041d707371007e01f10000c5467070707071007e041d71007e041d707070707371007e02197070707071007e041a7070707070707070707070707070707071007e02260000c5460000000000000000707071007e02297371007e00f0000000087571007e00f3000000017371007e00f50374000c4469736369706c696e654944707070707070707070707070707371007e01fe0000c546000000140001000000000000004200000019000000007071007e001071007e041870707070707071007e01c57070707071007e01c87371007e00e09caaef83663682d1d9b40617f83945a40000c5467070707070740005417269616c707070707070707070707070707371007e01da707371007e01de0000c5467070707071007e042b71007e042b71007e0428707371007e01e50000c5467070707071007e042b71007e042b707371007e01df0000c5467070707071007e042b71007e042b707371007e01ef0000c5467070707071007e042b71007e042b707371007e01f10000c5467070707071007e042b71007e042b707070707371007e02197070707071007e04287070707070707070707070707070707071007e02260000c5460000000000000000707071007e02297371007e00f0000000097571007e00f3000000047371007e00f5037400084578616d547970657371007e00f50174002b2e657175616c732820226578616d222029203f0a202022d18dd0bad0b7d0b0d0bcd0b5d0bd220a3a0a20207371007e00f5037400084578616d547970657371007e00f5017400432e657175616c73282022637265646974222029203f0a2020202022d0b7d0b0d187d0b5d182220a20203a0a2020202022d0b4d0b8d1842e20d0b7d0b0d187d0b5d18222707070707070707070707070707371007e01fe0000c54600000014000100000000000002c70000005b000000007071007e001071007e041870707070707071007e01c57070707071007e01c87371007e00e09aef2484ec5cdda951e279d922d541aa0000c5467070707070740005417269616c707070707070707070707070707371007e01da707371007e01de0000c5467070707071007e043f71007e043f71007e043c707371007e01e50000c5467070707071007e043f71007e043f707371007e01df0000c5467070707071007e043f71007e043f707371007e01ef0000c5467070707071007e043f71007e043f707371007e01f10000c5467070707071007e043f71007e043f707070707371007e02197070707071007e043c7070707070707070707070707070707071007e02260000c5460000000000000000707071007e02297371007e00f00000000a7571007e00f3000000017371007e00f50374000b5375626a6563744e616d65707070707070707070707070707870000000147371007e01f6000003227371007e02867371007e00f0000000107571007e00f3000000017371007e00f5027400115245504f52545f434f4e4e454354494f4e70707074000b6c697374446174617365747571007e028e000000027371007e02907371007e00f0000000117571007e00f3000000017371007e00f50374000767726f75704964707074000767726f757049647371007e02907371007e00f0000000127571007e00f3000000017371007e00f50374000573656d4964707074000573656d49647070707371007e00e09b6bf26831e36201123494274a3843ab707071007e0409737200326e65742e73662e6a61737065727265706f7274732e656e67696e652e636f6d706f6e656e742e436f6d706f6e656e744b657900000000000027d80200034c00046e616d6571007e00024c00096e616d65737061636571007e00024c000f6e616d65737061636550726566697871007e000278707400046c69737474003d687474703a2f2f6a61737065727265706f7274732e736f75726365666f7267652e6e65742f6a61737065727265706f7274732f636f6d706f6e656e74737400026a7278700000c546000000140170707070707371007e00117371007e001a000000037704000000037371007e01fe0000c546000000160001000000000000032200000000000000167071007e001071007e046470707070707071007e01c57070707071007e01c87371007e00e0a2cf579c37835445ac7f80c7465e43530000c5467070707070740005417269616c707371007e01ec4140000070707070707070707070707371007e01da707371007e01de0000c5467070707071007e046a71007e046a71007e0466707371007e01e50000c5467070707071007e046a71007e046a707371007e01df0000c5467070707071007e046a71007e046a707371007e01ef0000c5467070707071007e046a71007e046a707371007e01f10000c5467070707071007e046a71007e046a707070707371007e02197070707071007e04667070707070707070707070707070707071007e02260000c5460000000000000000707071007e02297371007e00f00000000a7571007e00f3000000067371007e00f50174000e22d09ad183d180d1812022202b207371007e00f502740009636f757273654e756d7371007e00f501740017202b20222c20d0b3d180d183d0bfd0bfd0b02022202b207371007e00f50274000867726f75704e756d7371007e00f501740019202b20222c20d181d0b5d0bcd0b5d181d182d1802022202b207371007e00f50274000873656d6573746572707070707070707070707070707371007e01fe0000c5460000001600010000000000000322000000000000002c7071007e001071007e046470707070707071007e01c57070707071007e01c87371007e00e0ab50a6c47b21d0bc0fb8663cb4594c890000c5467070707070740005417269616c707371007e01ec4140000070707070707070707070707371007e01da707371007e01de0000c5467070707071007e048371007e048371007e047f707371007e01e50000c5467070707071007e048371007e0483707371007e01df0000c5467070707071007e048371007e0483707371007e01ef0000c5467070707071007e048371007e0483707371007e01f10000c5467070707071007e048371007e0483707070707371007e02197070707071007e047f7070707070707070707070707070707071007e02260000c5460000000000000000707071007e02297371007e00f00000000b7571007e00f3000000027371007e00f50174002122d0a1d0bfd0b5d186d0b8d0b0d0bbd18cd0bdd0bed181d182d18c3a2022202b207371007e00f503740008737065634e616d65707070707070707070707070707371007e01fe0000c546000000160001000000000000032200000000000000007071007e001071007e046470707070707071007e01c57070707071007e01c87371007e00e0966f2647b809a18837a11cbdf5414f550000c5467070707070740005417269616c707371007e01ec4140000070707070707070707070707371007e01da707371007e01de0000c5467070707071007e049471007e049471007e0490707371007e01e50000c5467070707071007e049471007e0494707371007e01df0000c5467070707071007e049471007e0494707371007e01ef0000c5467070707071007e049471007e0494707371007e01f10000c5467070707071007e049471007e0494707070707371007e02197070707071007e04907070707070707070707070707070707071007e02260000c5460000000000000000707071007e02297371007e00f00000000c7571007e00f3000000027371007e00f50174001922d0a4d0b0d0bad183d0bbd18cd182d0b5d1823a2022202b207371007e00f5037400076661634e616d657070707070707070707070707078700000c546000000420170707071007e001e7e7200336e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e5768656e4e6f4461746154797065456e756d00000000000000001200007871007e001d7400084e4f5f5041474553737200366e65742e73662e6a61737065727265706f7274732e656e67696e652e64657369676e2e4a525265706f7274436f6d70696c654461746100000000000027d80200034c001363726f7373746162436f6d70696c654461746171007e00374c001264617461736574436f6d70696c654461746171007e00374c00166d61696e44617461736574436f6d70696c654461746171007e000178707371007e03c33f4000000000000c7708000000100000000171007e01f7757200025b42acf317f8060854e0020000787000000ba8cafebabe0000002e008b01002b6368657373576974684964735f43524f5353544142305f313433343339333231343332355f36373233383607000101002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a524576616c7561746f72070003010017706172616d657465725f5245504f52545f4c4f43414c450100324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d657465723b01001f706172616d657465725f5245504f52545f464f524d41545f464143544f525901001a706172616d657465725f5245504f52545f54494d455f5a4f4e4501001e706172616d657465725f5245504f52545f46494c455f5245534f4c56455201001f706172616d657465725f5245504f52545f504152414d45544552535f4d4150010018706172616d657465725f5245504f52545f434f4e5445585401001d706172616d657465725f5245504f52545f434c4153535f4c4f41444552010024706172616d657465725f5245504f52545f55524c5f48414e444c45525f464143544f5259010020706172616d657465725f5245504f52545f5245534f555243455f42554e444c450100127661726961626c655f524f575f434f554e540100314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c653b0100157661726961626c655f434f4c554d4e5f434f554e5401000b7661726961626c655f6c6e01000b7661726961626c655f69640100147661726961626c655f726174654d65617375726501001b7661726961626c655f726174654d6561737572655f69645f414c4c01001b7661726961626c655f726174654d6561737572655f6c6e5f414c4c01001e7661726961626c655f726174654d6561737572655f6c6e5f69645f414c4c0100063c696e69743e010003282956010004436f64650c001800190a0004001b0c00050006090002001d0c00070006090002001f0c0008000609000200210c0009000609000200230c000a000609000200250c000b000609000200270c000c000609000200290c000d0006090002002b0c000e0006090002002d0c000f0010090002002f0c0011001009000200310c0012001009000200330c0013001009000200350c0014001009000200370c0015001009000200390c00160010090002003b0c00170010090002003d01000f4c696e654e756d6265725461626c6501000e637573746f6d697a6564496e6974010030284c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b295601000a696e6974506172616d73010012284c6a6176612f7574696c2f4d61703b29560c004200430a00020044010008696e6974566172730c004600430a0002004701000d5245504f52545f4c4f43414c4508004901000d6a6176612f7574696c2f4d617007004b010003676574010026284c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f4f626a6563743b0c004d004e0b004c004f0100306e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d657465720700510100155245504f52545f464f524d41545f464143544f52590800530100105245504f52545f54494d455f5a4f4e450800550100145245504f52545f46494c455f5245534f4c5645520800570100155245504f52545f504152414d45544552535f4d415008005901000e5245504f52545f434f4e5445585408005b0100135245504f52545f434c4153535f4c4f4144455208005d01001a5245504f52545f55524c5f48414e444c45525f464143544f525908005f0100165245504f52545f5245534f555243455f42554e444c45080061010009524f575f434f554e5408006301002f6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c6507006501000c434f4c554d4e5f434f554e540800670100026c6e080069010002696408006b01000b726174654d65617375726508006d010012726174654d6561737572655f69645f414c4c08006f010012726174654d6561737572655f6c6e5f414c4c080071010015726174654d6561737572655f6c6e5f69645f414c4c0800730100086576616c756174650100152849294c6a6176612f6c616e672f4f626a6563743b01000a457863657074696f6e730100136a6176612f6c616e672f5468726f7761626c6507007801000867657456616c756501001428294c6a6176612f6c616e672f4f626a6563743b0c007a007b0a0066007c0100106a6176612f6c616e672f537472696e6707007e0100116a6176612f6c616e672f496e7465676572070080010008696e7456616c75650100032829490c008200830a008100840100012d08008601000b6576616c756174654f6c640100116576616c75617465457374696d6174656401000a536f7572636546696c650021000200040000001100020005000600000002000700060000000200080006000000020009000600000002000a000600000002000b000600000002000c000600000002000d000600000002000e000600000002000f00100000000200110010000000020012001000000002001300100000000200140010000000020015001000000002001600100000000200170010000000070001001800190001001a000000ba000200010000005a2ab7001c2a01b5001e2a01b500202a01b500222a01b500242a01b500262a01b500282a01b5002a2a01b5002c2a01b5002e2a01b500302a01b500322a01b500342a01b500362a01b500382a01b5003a2a01b5003c2a01b5003eb100000001003f0000004e001300000012000400190009001a000e001b0013001c0018001d001d001e0022001f00270020002c00210031002200360023003b00240040002500450026004a0027004f002800540029005900120001004000410001001a0000002b000200040000000b2a2bb700452a2db70048b100000001003f0000000e00030000003500050036000a00370002004200430001001a000000df00030002000000a32a2b124ab900500200c00052c00052b5001e2a2b1254b900500200c00052c00052b500202a2b1256b900500200c00052c00052b500222a2b1258b900500200c00052c00052b500242a2b125ab900500200c00052c00052b500262a2b125cb900500200c00052c00052b500282a2b125eb900500200c00052c00052b5002a2a2b1260b900500200c00052c00052b5002c2a2b1262b900500200c00052c00052b5002eb100000001003f0000002a000a0000003f00120040002400410036004200480043005a0044006c0045007e00460090004700a200480002004600430001001a000000c900030002000000912a2b1264b900500200c00066c00066b500302a2b1268b900500200c00066c00066b500322a2b126ab900500200c00066c00066b500342a2b126cb900500200c00066c00066b500362a2b126eb900500200c00066c00066b500382a2b1270b900500200c00066c00066b5003a2a2b1272b900500200c00066c00066b5003c2a2b1274b900500200c00066c00066b5003eb100000001003f0000002600090000005000120051002400520036005300480054005a0055006c0056007e005700900058000100750076000200770000000400010079001a0000009b0001000300000067014d1baa0000006200000000000000020000001900000027000000352ab40034b6007dc0007f4da7003e2ab40036b6007dc000814da700302ab40038b6007dc00081c600132ab40038b6007dc00081b600859c00081287a7000d2ab40038b6007dc000814d2cb000000001003f0000002200080000006000020062001c006600270067002a006b0035006c0038007000650078000100880076000200770000000400010079001a0000001a000100020000000201b000000001003f00000006000100000081000100890076000200770000000400010079001a0000001a000100020000000201b000000001003f0000000600010000008a0001008a000000020001787371007e03c33f4000000000000c7708000000100000000271007e013a7571007e04a700001463cafebabe0000002e00d601002d6368657373576974684964735f6c697374446174617365745f313433343339333231343332355f36373233383607000101002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a524576616c7561746f72070003010017706172616d657465725f5245504f52545f4c4f43414c450100324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d657465723b010017706172616d657465725f4a41535045525f5245504f525401001a706172616d657465725f5245504f52545f54494d455f5a4f4e45010015706172616d657465725f534f52545f4649454c445301001e706172616d657465725f5245504f52545f46494c455f5245534f4c56455201001a706172616d657465725f5245504f52545f5343524950544c455401001f706172616d657465725f5245504f52545f504152414d45544552535f4d415001001b706172616d657465725f5245504f52545f434f4e4e454354494f4e010018706172616d657465725f5245504f52545f434f4e5445585401001d706172616d657465725f5245504f52545f434c4153535f4c4f41444552010024706172616d657465725f5245504f52545f55524c5f48414e444c45525f464143544f525901001c706172616d657465725f5245504f52545f444154415f534f55524345010010706172616d657465725f46494c544552010011706172616d657465725f67726f75704964010020706172616d657465725f4a41535045525f5245504f5254535f434f4e5445585401001f706172616d657465725f5245504f52545f464f524d41545f464143544f525901001a706172616d657465725f5245504f52545f4d41585f434f554e5401000f706172616d657465725f73656d496401001a706172616d657465725f5245504f52545f54454d504c41544553010020706172616d657465725f5245504f52545f5245534f555243455f42554e444c450100116669656c645f5375626a6563744e616d6501002e4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c643b0100126669656c645f4469736369706c696e65494401000e6669656c645f4578616d547970650100147661726961626c655f504147455f4e554d4245520100314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c653b0100167661726961626c655f434f4c554d4e5f4e554d4245520100157661726961626c655f5245504f52545f434f554e540100137661726961626c655f504147455f434f554e540100157661726961626c655f434f4c554d4e5f434f554e540100063c696e69743e010003282956010004436f64650c002400250a000400270c0005000609000200290c00070006090002002b0c00080006090002002d0c00090006090002002f0c000a000609000200310c000b000609000200330c000c000609000200350c000d000609000200370c000e000609000200390c000f0006090002003b0c00100006090002003d0c00110006090002003f0c0012000609000200410c0013000609000200430c0014000609000200450c0015000609000200470c0016000609000200490c00170006090002004b0c00180006090002004d0c00190006090002004f0c001a001b09000200510c001c001b09000200530c001d001b09000200550c001e001f09000200570c0020001f09000200590c0021001f090002005b0c0022001f090002005d0c0023001f090002005f01000f4c696e654e756d6265725461626c6501000e637573746f6d697a6564496e6974010030284c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b295601000a696e6974506172616d73010012284c6a6176612f7574696c2f4d61703b29560c006400650a0002006601000a696e69744669656c64730c006800650a00020069010008696e6974566172730c006b00650a0002006c01000d5245504f52545f4c4f43414c4508006e01000d6a6176612f7574696c2f4d6170070070010003676574010026284c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f4f626a6563743b0c007200730b007100740100306e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d6574657207007601000d4a41535045525f5245504f52540800780100105245504f52545f54494d455f5a4f4e4508007a01000b534f52545f4649454c445308007c0100145245504f52545f46494c455f5245534f4c56455208007e0100105245504f52545f5343524950544c45540800800100155245504f52545f504152414d45544552535f4d41500800820100115245504f52545f434f4e4e454354494f4e08008401000e5245504f52545f434f4e544558540800860100135245504f52545f434c4153535f4c4f4144455208008801001a5245504f52545f55524c5f48414e444c45525f464143544f525908008a0100125245504f52545f444154415f534f5552434508008c01000646494c54455208008e01000767726f757049640800900100164a41535045525f5245504f5254535f434f4e544558540800920100155245504f52545f464f524d41545f464143544f52590800940100105245504f52545f4d41585f434f554e5408009601000573656d49640800980100105245504f52545f54454d504c4154455308009a0100165245504f52545f5245534f555243455f42554e444c4508009c01000b5375626a6563744e616d6508009e01002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c640700a001000c4469736369706c696e6549440800a20100084578616d547970650800a401000b504147455f4e554d4245520800a601002f6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c650700a801000d434f4c554d4e5f4e554d4245520800aa01000c5245504f52545f434f554e540800ac01000a504147455f434f554e540800ae01000c434f4c554d4e5f434f554e540800b00100086576616c756174650100152849294c6a6176612f6c616e672f4f626a6563743b01000a457863657074696f6e730100136a6176612f6c616e672f5468726f7761626c650700b50100116a6176612f6c616e672f496e74656765720700b7010004284929560c002400b90a00b800ba01000867657456616c756501001428294c6a6176612f6c616e672f4f626a6563743b0c00bc00bd0a00a100be0100106a6176612f6c616e672f537472696e670700c00100046578616d0800c2010006657175616c73010015284c6a6176612f6c616e672f4f626a6563743b295a0c00c400c50a00c100c601000ed18dd0bad0b7d0b0d0bcd0b5d0bd0800c80100066372656469740800ca01000ad0b7d0b0d187d0b5d1820800cc010012d0b4d0b8d1842e20d0b7d0b0d187d0b5d1820800ce01000b6576616c756174654f6c6401000b6765744f6c6456616c75650c00d100bd0a00a100d20100116576616c75617465457374696d6174656401000a536f7572636546696c650021000200040000001c00020005000600000002000700060000000200080006000000020009000600000002000a000600000002000b000600000002000c000600000002000d000600000002000e000600000002000f0006000000020010000600000002001100060000000200120006000000020013000600000002001400060000000200150006000000020016000600000002001700060000000200180006000000020019000600000002001a001b00000002001c001b00000002001d001b00000002001e001f000000020020001f000000020021001f000000020022001f000000020023001f00000008000100240025000100260000011d00020001000000912ab700282a01b5002a2a01b5002c2a01b5002e2a01b500302a01b500322a01b500342a01b500362a01b500382a01b5003a2a01b5003c2a01b5003e2a01b500402a01b500422a01b500442a01b500462a01b500482a01b5004a2a01b5004c2a01b5004e2a01b500502a01b500522a01b500542a01b500562a01b500582a01b5005a2a01b5005c2a01b5005e2a01b50060b10000000100610000007a001e00000012000400190009001a000e001b0013001c0018001d001d001e0022001f00270020002c00210031002200360023003b00240040002500450026004a0027004f0028005400290059002a005e002b0063002c0068002d006d002e0072002f00770030007c00310081003200860033008b003400900012000100620063000100260000003400020004000000102a2bb700672a2cb7006a2a2db7006db10000000100610000001200040000004000050041000a0042000f004300020064006500010026000001d100030002000001692a2b126fb900750200c00077c00077b5002a2a2b1279b900750200c00077c00077b5002c2a2b127bb900750200c00077c00077b5002e2a2b127db900750200c00077c00077b500302a2b127fb900750200c00077c00077b500322a2b1281b900750200c00077c00077b500342a2b1283b900750200c00077c00077b500362a2b1285b900750200c00077c00077b500382a2b1287b900750200c00077c00077b5003a2a2b1289b900750200c00077c00077b5003c2a2b128bb900750200c00077c00077b5003e2a2b128db900750200c00077c00077b500402a2b128fb900750200c00077c00077b500422a2b1291b900750200c00077c00077b500442a2b1293b900750200c00077c00077b500462a2b1295b900750200c00077c00077b500482a2b1297b900750200c00077c00077b5004a2a2b1299b900750200c00077c00077b5004c2a2b129bb900750200c00077c00077b5004e2a2b129db900750200c00077c00077b50050b10000000100610000005600150000004b0012004c0024004d0036004e0048004f005a0050006c0051007e00520090005300a2005400b4005500c6005600d8005700ea005800fc0059010e005a0120005b0132005c0144005d0156005e0168005f000200680065000100260000005b00030002000000372a2b129fb900750200c000a1c000a1b500522a2b12a3b900750200c000a1c000a1b500542a2b12a5b900750200c000a1c000a1b50056b10000000100610000001200040000006700120068002400690036006a0002006b00650001002600000087000300020000005b2a2b12a7b900750200c000a9c000a9b500582a2b12abb900750200c000a9c000a9b5005a2a2b12adb900750200c000a9c000a9b5005c2a2b12afb900750200c000a9c000a9b5005e2a2b12b1b900750200c000a9c000a9b50060b10000000100610000001a00060000007200120073002400740036007500480076005a0077000100b200b3000200b400000004000100b600260000017300030003000000eb014d1baa000000e6000000000000000a0000003900000045000000510000005d0000006900000075000000810000008d00000099000000a7000000dbbb00b85904b700bb4da700a4bb00b85904b700bb4da70098bb00b85904b700bb4da7008cbb00b85903b700bb4da70080bb00b85904b700bb4da70074bb00b85903b700bb4da70068bb00b85904b700bb4da7005cbb00b85903b700bb4da700502ab40054b600bfc000b84da700422ab40056b600bfc000c112c3b600c799000812c9a7001c2ab40056b600bfc000c112cbb600c799000812cda7000512cf4da7000e2ab40052b600bfc000c14d2cb000000001006100000076001d0000007f00020081003c0085004500860048008a0051008b0054008f005d00900060009400690095006c00990075009a0078009e0081009f008400a3008d00a4009000a8009900a9009c00ad00a700ae00aa00b200bc00b300c100b500d300b600d800b800da00b200db00b900de00bd00e900c5000100d000b3000200b400000004000100b600260000017300030003000000eb014d1baa000000e6000000000000000a0000003900000045000000510000005d0000006900000075000000810000008d00000099000000a7000000dbbb00b85904b700bb4da700a4bb00b85904b700bb4da70098bb00b85904b700bb4da7008cbb00b85903b700bb4da70080bb00b85904b700bb4da70074bb00b85903b700bb4da70068bb00b85904b700bb4da7005cbb00b85903b700bb4da700502ab40054b600d3c000b84da700422ab40056b600d3c000c112c3b600c799000812c9a7001c2ab40056b600d3c000c112cbb600c799000812cda7000512cf4da7000e2ab40052b600d3c000c14d2cb000000001006100000076001d000000ce000200d0003c00d4004500d5004800d9005100da005400de005d00df006000e3006900e4006c00e8007500e9007800ed008100ee008400f2008d00f3009000f7009900f8009c00fc00a700fd00aa010100bc010200c1010400d3010500d8010700da010100db010800de010c00e90114000100d400b3000200b400000004000100b600260000017300030003000000eb014d1baa000000e6000000000000000a0000003900000045000000510000005d0000006900000075000000810000008d00000099000000a7000000dbbb00b85904b700bb4da700a4bb00b85904b700bb4da70098bb00b85904b700bb4da7008cbb00b85903b700bb4da70080bb00b85904b700bb4da70074bb00b85903b700bb4da70068bb00b85904b700bb4da7005cbb00b85903b700bb4da700502ab40054b600bfc000b84da700422ab40056b600bfc000c112c3b600c799000812c9a7001c2ab40056b600bfc000c112cbb600c799000812cda7000512cf4da7000e2ab40052b600bfc000c14d2cb000000001006100000076001d0000011d0002011f003c01230045012400480128005101290054012d005d012e0060013200690133006c0137007501380078013c0081013d00840141008d01420090014600990147009c014b00a7014c00aa015000bc015100c1015300d3015400d8015600da015000db015700de015b00e90163000100d500000002000171007e005c7571007e04a700001806cafebabe0000002e01000100316368657373576974684964735f63726f7373746162446174617365745f313433343339333231343332355f36373233383607000101002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a524576616c7561746f72070003010017706172616d657465725f5245504f52545f4c4f43414c450100324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d657465723b010017706172616d657465725f4a41535045525f5245504f525401001a706172616d657465725f5245504f52545f54494d455f5a4f4e45010015706172616d657465725f534f52545f4649454c445301001e706172616d657465725f5245504f52545f46494c455f5245534f4c56455201001a706172616d657465725f5245504f52545f5343524950544c455401001f706172616d657465725f5245504f52545f504152414d45544552535f4d415001001b706172616d657465725f5245504f52545f434f4e4e454354494f4e010018706172616d657465725f5245504f52545f434f4e5445585401001d706172616d657465725f5245504f52545f434c4153535f4c4f41444552010024706172616d657465725f5245504f52545f55524c5f48414e444c45525f464143544f525901001c706172616d657465725f5245504f52545f444154415f534f55524345010010706172616d657465725f46494c544552010011706172616d657465725f67726f75704964010020706172616d657465725f4a41535045525f5245504f5254535f434f4e5445585401001f706172616d657465725f5245504f52545f464f524d41545f464143544f525901001a706172616d657465725f5245504f52545f4d41585f434f554e5401000f706172616d657465725f73656d496401001a706172616d657465725f5245504f52545f54454d504c41544553010020706172616d657465725f5245504f52545f5245534f555243455f42554e444c4501000d6669656c645f5375627479706501002e4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c643b0100116669656c645f5375626a6563744e616d650100116669656c645f72617465526567756c61720100086669656c645f494401000e6669656c645f4578616d5479706501000f6669656c645f46697273744e616d6501000e6669656c645f4c6173744e616d650100106669656c645f5365636f6e644e616d650100147661726961626c655f504147455f4e554d4245520100314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c653b0100167661726961626c655f434f4c554d4e5f4e554d4245520100157661726961626c655f5245504f52545f434f554e540100137661726961626c655f504147455f434f554e540100157661726961626c655f434f4c554d4e5f434f554e540100063c696e69743e010003282956010004436f64650c0029002a0a0004002c0c00050006090002002e0c0007000609000200300c0008000609000200320c0009000609000200340c000a000609000200360c000b000609000200380c000c0006090002003a0c000d0006090002003c0c000e0006090002003e0c000f000609000200400c0010000609000200420c0011000609000200440c0012000609000200460c0013000609000200480c00140006090002004a0c00150006090002004c0c00160006090002004e0c0017000609000200500c0018000609000200520c0019000609000200540c001a001b09000200560c001c001b09000200580c001d001b090002005a0c001e001b090002005c0c001f001b090002005e0c0020001b09000200600c0021001b09000200620c0022001b09000200640c0023002409000200660c0025002409000200680c00260024090002006a0c00270024090002006c0c00280024090002006e01000f4c696e654e756d6265725461626c6501000e637573746f6d697a6564496e6974010030284c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b295601000a696e6974506172616d73010012284c6a6176612f7574696c2f4d61703b29560c007300740a0002007501000a696e69744669656c64730c007700740a00020078010008696e6974566172730c007a00740a0002007b01000d5245504f52545f4c4f43414c4508007d01000d6a6176612f7574696c2f4d617007007f010003676574010026284c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f4f626a6563743b0c008100820b008000830100306e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d6574657207008501000d4a41535045525f5245504f52540800870100105245504f52545f54494d455f5a4f4e4508008901000b534f52545f4649454c445308008b0100145245504f52545f46494c455f5245534f4c56455208008d0100105245504f52545f5343524950544c455408008f0100155245504f52545f504152414d45544552535f4d41500800910100115245504f52545f434f4e4e454354494f4e08009301000e5245504f52545f434f4e544558540800950100135245504f52545f434c4153535f4c4f4144455208009701001a5245504f52545f55524c5f48414e444c45525f464143544f52590800990100125245504f52545f444154415f534f5552434508009b01000646494c54455208009d01000767726f7570496408009f0100164a41535045525f5245504f5254535f434f4e544558540800a10100155245504f52545f464f524d41545f464143544f52590800a30100105245504f52545f4d41585f434f554e540800a501000573656d49640800a70100105245504f52545f54454d504c415445530800a90100165245504f52545f5245534f555243455f42554e444c450800ab010007537562747970650800ad01002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c640700af01000b5375626a6563744e616d650800b101000b72617465526567756c61720800b301000249440800b50100084578616d547970650800b701000946697273744e616d650800b90100084c6173744e616d650800bb01000a5365636f6e644e616d650800bd01000b504147455f4e554d4245520800bf01002f6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c650700c101000d434f4c554d4e5f4e554d4245520800c301000c5245504f52545f434f554e540800c501000a504147455f434f554e540800c701000c434f4c554d4e5f434f554e540800c90100086576616c756174650100152849294c6a6176612f6c616e672f4f626a6563743b01000a457863657074696f6e730100136a6176612f6c616e672f5468726f7761626c650700ce0100116a6176612f6c616e672f496e74656765720700d0010004284929560c002900d20a00d100d30100166a6176612f6c616e672f537472696e674275666665720700d501000867657456616c756501001428294c6a6176612f6c616e672f4f626a6563743b0c00d700d80a00b000d90100106a6176612f6c616e672f537472696e670700db01000776616c75654f66010026284c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f537472696e673b0c00dd00de0a00dc00df010015284c6a6176612f6c616e672f537472696e673b29560c002900e10a00d600e2010001200800e4010006617070656e6401002c284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f537472696e674275666665723b0c00e600e70a00d600e80100076973456d70747901000328295a0c00ea00eb0a00dc00ec0100000800ee010009737562737472696e67010016284949294c6a6176612f6c616e672f537472696e673b0c00f000f10a00dc00f20100012e0800f4010008746f537472696e6701001428294c6a6176612f6c616e672f537472696e673b0c00f600f70a00d600f801000b6576616c756174654f6c6401000b6765744f6c6456616c75650c00fb00d80a00b000fc0100116576616c75617465457374696d6174656401000a536f7572636546696c650021000200040000002100020005000600000002000700060000000200080006000000020009000600000002000a000600000002000b000600000002000c000600000002000d000600000002000e000600000002000f0006000000020010000600000002001100060000000200120006000000020013000600000002001400060000000200150006000000020016000600000002001700060000000200180006000000020019000600000002001a001b00000002001c001b00000002001d001b00000002001e001b00000002001f001b000000020020001b000000020021001b000000020022001b000000020023002400000002002500240000000200260024000000020027002400000002002800240000000800010029002a0001002b0000014a00020001000000aa2ab7002d2a01b5002f2a01b500312a01b500332a01b500352a01b500372a01b500392a01b5003b2a01b5003d2a01b5003f2a01b500412a01b500432a01b500452a01b500472a01b500492a01b5004b2a01b5004d2a01b5004f2a01b500512a01b500532a01b500552a01b500572a01b500592a01b5005b2a01b5005d2a01b5005f2a01b500612a01b500632a01b500652a01b500672a01b500692a01b5006b2a01b5006d2a01b5006fb10000000100700000008e002300000012000400190009001a000e001b0013001c0018001d001d001e0022001f00270020002c00210031002200360023003b00240040002500450026004a0027004f0028005400290059002a005e002b0063002c0068002d006d002e0072002f00770030007c00310081003200860033008b00340090003500950036009a0037009f003800a4003900a900120001007100720001002b0000003400020004000000102a2bb700762a2cb700792a2db7007cb10000000100700000001200040000004500050046000a0047000f00480002007300740001002b000001d100030002000001692a2b127eb900840200c00086c00086b5002f2a2b1288b900840200c00086c00086b500312a2b128ab900840200c00086c00086b500332a2b128cb900840200c00086c00086b500352a2b128eb900840200c00086c00086b500372a2b1290b900840200c00086c00086b500392a2b1292b900840200c00086c00086b5003b2a2b1294b900840200c00086c00086b5003d2a2b1296b900840200c00086c00086b5003f2a2b1298b900840200c00086c00086b500412a2b129ab900840200c00086c00086b500432a2b129cb900840200c00086c00086b500452a2b129eb900840200c00086c00086b500472a2b12a0b900840200c00086c00086b500492a2b12a2b900840200c00086c00086b5004b2a2b12a4b900840200c00086c00086b5004d2a2b12a6b900840200c00086c00086b5004f2a2b12a8b900840200c00086c00086b500512a2b12aab900840200c00086c00086b500532a2b12acb900840200c00086c00086b50055b10000000100700000005600150000005000120051002400520036005300480054005a0055006c0056007e00570090005800a2005900b4005a00c6005b00d8005c00ea005d00fc005e010e005f01200060013200610144006201560063016800640002007700740001002b000000c900030002000000912a2b12aeb900840200c000b0c000b0b500572a2b12b2b900840200c000b0c000b0b500592a2b12b4b900840200c000b0c000b0b5005b2a2b12b6b900840200c000b0c000b0b5005d2a2b12b8b900840200c000b0c000b0b5005f2a2b12bab900840200c000b0c000b0b500612a2b12bcb900840200c000b0c000b0b500632a2b12beb900840200c000b0c000b0b50065b10000000100700000002600090000006c0012006d0024006e0036006f00480070005a0071006c0072007e0073009000740002007a00740001002b00000087000300020000005b2a2b12c0b900840200c000c2c000c2b500672a2b12c4b900840200c000c2c000c2b500692a2b12c6b900840200c000c2c000c2b5006b2a2b12c8b900840200c000c2c000c2b5006d2a2b12cab900840200c000c2c000c2b5006fb10000000100700000001a00060000007c0012007d0024007e0036007f00480080005a0081000100cb00cc000200cd00000004000100cf002b000001e30006000300000163014d1baa0000015e000000000000000a0000003900000045000000510000005d0000006900000075000000810000008d000000990000014500000153bb00d15904b700d44da7011cbb00d15904b700d44da70110bb00d15904b700d44da70104bb00d15903b700d44da700f8bb00d15904b700d44da700ecbb00d15903b700d44da700e0bb00d15904b700d44da700d4bb00d15903b700d44da700c8bb00d6592ab40063b600dac000dcb800e0b700e312e5b600e92ab40061b600dac000dcc600132ab40061b600dac000dcb600ed99000812efa70024bb00d6592ab40061b600dac000dc0304b600f3b800e0b700e312f5b600e9b600f9b600e92ab40065b600dac000dcc600132ab40065b600dac000dcb600ed99000812efa70024bb00d6592ab40065b600dac000dc0304b600f3b800e0b700e312f5b600e9b600f9b600e9b600f94da7001c2ab4005db600dac000d14da7000e2ab4005bb600dac000d14d2cb00000000100700000006e001b000000890002008b003c008f00450090004800940051009500540099005d009a0060009e0069009f006c00a3007500a4007800a8008100a9008400ad008d00ae009000b2009900b3009c00b700b500b800fb00b9014100b7014500ba014800be015300bf015600c3016100cb000100fa00cc000200cd00000004000100cf002b000001e30006000300000163014d1baa0000015e000000000000000a0000003900000045000000510000005d0000006900000075000000810000008d000000990000014500000153bb00d15904b700d44da7011cbb00d15904b700d44da70110bb00d15904b700d44da70104bb00d15903b700d44da700f8bb00d15904b700d44da700ecbb00d15903b700d44da700e0bb00d15904b700d44da700d4bb00d15903b700d44da700c8bb00d6592ab40063b600fdc000dcb800e0b700e312e5b600e92ab40061b600fdc000dcc600132ab40061b600fdc000dcb600ed99000812efa70024bb00d6592ab40061b600fdc000dc0304b600f3b800e0b700e312f5b600e9b600f9b600e92ab40065b600fdc000dcc600132ab40065b600fdc000dcb600ed99000812efa70024bb00d6592ab40065b600fdc000dc0304b600f3b800e0b700e312f5b600e9b600f9b600e9b600f94da7001c2ab4005db600fdc000d14da7000e2ab4005bb600fdc000d14d2cb00000000100700000006e001b000000d4000200d6003c00da004500db004800df005100e0005400e4005d00e5006000e9006900ea006c00ee007500ef007800f3008100f4008400f8008d00f9009000fd009900fe009c010200b5010300fb01040141010201450105014801090153010a0156010e01610116000100fe00cc000200cd00000004000100cf002b000001e30006000300000163014d1baa0000015e000000000000000a0000003900000045000000510000005d0000006900000075000000810000008d000000990000014500000153bb00d15904b700d44da7011cbb00d15904b700d44da70110bb00d15904b700d44da70104bb00d15903b700d44da700f8bb00d15904b700d44da700ecbb00d15903b700d44da700e0bb00d15904b700d44da700d4bb00d15903b700d44da700c8bb00d6592ab40063b600dac000dcb800e0b700e312e5b600e92ab40061b600dac000dcc600132ab40061b600dac000dcb600ed99000812efa70024bb00d6592ab40061b600dac000dc0304b600f3b800e0b700e312f5b600e9b600f9b600e92ab40065b600dac000dcc600132ab40065b600dac000dcb600ed99000812efa70024bb00d6592ab40065b600dac000dc0304b600f3b800e0b700e312f5b600e9b600f9b600e9b600f94da7001c2ab4005db600dac000d14da7000e2ab4005bb600dac000d14d2cb00000000100700000006e001b0000011f00020121003c0125004501260048012a0051012b0054012f005d01300060013400690135006c01390075013a0078013e0081013f00840143008d01440090014800990149009c014d00b5014e00fb014f0141014d0145015001480154015301550156015901610161000100ff000000020001787571007e04a700001a9dcafebabe0000002e010b0100216368657373576974684964735f313433343339333231343332355f36373233383607000101002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a524576616c7561746f72070003010017706172616d657465725f4a41535045525f5245504f52540100324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d657465723b01001a706172616d657465725f5245504f52545f54494d455f5a4f4e45010011706172616d657465725f73656d5965617201001e706172616d657465725f5245504f52545f46494c455f5245534f4c56455201001f706172616d657465725f5245504f52545f504152414d45544552535f4d4150010012706172616d657465725f67726f75704e756d010018706172616d657465725f5245504f52545f434f4e5445585401001d706172616d657465725f5245504f52545f434c4153535f4c4f4144455201001c706172616d657465725f5245504f52545f444154415f534f55524345010024706172616d657465725f5245504f52545f55524c5f48414e444c45525f464143544f525901001e706172616d657465725f49535f49474e4f52455f504147494e4154494f4e01001a706172616d657465725f5245504f52545f4d41585f434f554e5401001a706172616d657465725f5245504f52545f54454d504c41544553010017706172616d657465725f5245504f52545f4c4f43414c4501001c706172616d657465725f5245504f52545f5649525455414c495a4552010015706172616d657465725f534f52545f4649454c445301001a706172616d657465725f5245504f52545f5343524950544c4554010010706172616d657465725f73656d4e756d01001b706172616d657465725f5245504f52545f434f4e4e454354494f4e010010706172616d657465725f46494c544552010020706172616d657465725f4a41535045525f5245504f5254535f434f4e5445585401001f706172616d657465725f5245504f52545f464f524d41545f464143544f5259010010706172616d657465725f646567726565010013706172616d657465725f636f757273654e756d010020706172616d657465725f5245504f52545f5245534f555243455f42554e444c45010012706172616d657465725f73656d657374657201000d6669656c645f67726f7570496401002e4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c643b01000b6669656c645f73656d496401000e6669656c645f737065634e616d6501000d6669656c645f6661634e616d650100147661726961626c655f504147455f4e554d4245520100314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c653b0100167661726961626c655f434f4c554d4e5f4e554d4245520100157661726961626c655f5245504f52545f434f554e540100137661726961626c655f504147455f434f554e540100157661726961626c655f434f4c554d4e5f434f554e540100063c696e69743e010003282956010004436f64650c002b002c0a0004002e0c0005000609000200300c0007000609000200320c0008000609000200340c0009000609000200360c000a000609000200380c000b0006090002003a0c000c0006090002003c0c000d0006090002003e0c000e000609000200400c000f000609000200420c0010000609000200440c0011000609000200460c0012000609000200480c00130006090002004a0c00140006090002004c0c00150006090002004e0c0016000609000200500c0017000609000200520c0018000609000200540c0019000609000200560c001a000609000200580c001b0006090002005a0c001c0006090002005c0c001d0006090002005e0c001e000609000200600c001f000609000200620c0020002109000200640c0022002109000200660c0023002109000200680c00240021090002006a0c00250026090002006c0c00270026090002006e0c0028002609000200700c0029002609000200720c002a0026090002007401000f4c696e654e756d6265725461626c6501000e637573746f6d697a6564496e6974010030284c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b295601000a696e6974506172616d73010012284c6a6176612f7574696c2f4d61703b29560c0079007a0a0002007b01000a696e69744669656c64730c007d007a0a0002007e010008696e6974566172730c0080007a0a0002008101000d4a41535045525f5245504f525408008301000d6a6176612f7574696c2f4d6170070085010003676574010026284c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f4f626a6563743b0c008700880b008600890100306e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d6574657207008b0100105245504f52545f54494d455f5a4f4e4508008d01000773656d5965617208008f0100145245504f52545f46494c455f5245534f4c5645520800910100155245504f52545f504152414d45544552535f4d415008009301000867726f75704e756d08009501000e5245504f52545f434f4e544558540800970100135245504f52545f434c4153535f4c4f414445520800990100125245504f52545f444154415f534f5552434508009b01001a5245504f52545f55524c5f48414e444c45525f464143544f525908009d01001449535f49474e4f52455f504147494e4154494f4e08009f0100105245504f52545f4d41585f434f554e540800a10100105245504f52545f54454d504c415445530800a301000d5245504f52545f4c4f43414c450800a50100125245504f52545f5649525455414c495a45520800a701000b534f52545f4649454c44530800a90100105245504f52545f5343524950544c45540800ab01000673656d4e756d0800ad0100115245504f52545f434f4e4e454354494f4e0800af01000646494c5445520800b10100164a41535045525f5245504f5254535f434f4e544558540800b30100155245504f52545f464f524d41545f464143544f52590800b50100066465677265650800b7010009636f757273654e756d0800b90100165245504f52545f5245534f555243455f42554e444c450800bb01000873656d65737465720800bd01000767726f757049640800bf01002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c640700c101000573656d49640800c3010008737065634e616d650800c50100076661634e616d650800c701000b504147455f4e554d4245520800c901002f6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c650700cb01000d434f4c554d4e5f4e554d4245520800cd01000c5245504f52545f434f554e540800cf01000a504147455f434f554e540800d101000c434f4c554d4e5f434f554e540800d30100086576616c756174650100152849294c6a6176612f6c616e672f4f626a6563743b01000a457863657074696f6e730100136a6176612f6c616e672f5468726f7761626c650700d801000867657456616c756501001428294c6a6176612f6c616e672f4f626a6563743b0c00da00db0a008c00dc0100106a6176612f6c616e672f537472696e670700de0100022c200800e001000573706c6974010027284c6a6176612f6c616e672f537472696e673b295b4c6a6176612f6c616e672f537472696e673b0c00e200e30a00df00e40100116a6176612f6c616e672f496e74656765720700e6010004284929560c002b00e80a00e700e90100166a6176612f6c616e672f537472696e674275666665720700eb010009d09ad183d180d181200800ed010015284c6a6176612f6c616e672f537472696e673b29560c002b00ef0a00ec00f0010006617070656e6401002c284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f537472696e674275666665723b0c00f200f30a00ec00f401000f2c20d0b3d180d183d0bfd0bfd0b0200800f60100112c20d181d0b5d0bcd0b5d181d182d180200800f8010008746f537472696e6701001428294c6a6176612f6c616e672f537472696e673b0c00fa00fb0a00ec00fc01001cd0a1d0bfd0b5d186d0b8d0b0d0bbd18cd0bdd0bed181d182d18c3a200800fe0a00c200dc010014d0a4d0b0d0bad183d0bbd18cd182d0b5d1823a200801010100136a6176612f73716c2f436f6e6e656374696f6e07010301000b6576616c756174654f6c6401000b6765744f6c6456616c75650c010600db0a00c201070100116576616c75617465457374696d6174656401000a536f7572636546696c650021000200040000002300020005000600000002000700060000000200080006000000020009000600000002000a000600000002000b000600000002000c000600000002000d000600000002000e000600000002000f0006000000020010000600000002001100060000000200120006000000020013000600000002001400060000000200150006000000020016000600000002001700060000000200180006000000020019000600000002001a000600000002001b000600000002001c000600000002001d000600000002001e000600000002001f00060000000200200021000000020022002100000002002300210000000200240021000000020025002600000002002700260000000200280026000000020029002600000002002a0026000000080001002b002c0001002d0000015c00020001000000b42ab7002f2a01b500312a01b500332a01b500352a01b500372a01b500392a01b5003b2a01b5003d2a01b5003f2a01b500412a01b500432a01b500452a01b500472a01b500492a01b5004b2a01b5004d2a01b5004f2a01b500512a01b500532a01b500552a01b500572a01b500592a01b5005b2a01b5005d2a01b5005f2a01b500612a01b500632a01b500652a01b500672a01b500692a01b5006b2a01b5006d2a01b5006f2a01b500712a01b500732a01b50075b100000001007600000096002500000012000400190009001a000e001b0013001c0018001d001d001e0022001f00270020002c00210031002200360023003b00240040002500450026004a0027004f0028005400290059002a005e002b0063002c0068002d006d002e0072002f00770030007c00310081003200860033008b00340090003500950036009a0037009f003800a4003900a9003a00ae003b00b300120001007700780001002d0000003400020004000000102a2bb7007c2a2cb7007f2a2db70082b10000000100760000001200040000004700050048000a0049000f004a00020079007a0001002d0000025500030002000001d52a2b1284b9008a0200c0008cc0008cb500312a2b128eb9008a0200c0008cc0008cb500332a2b1290b9008a0200c0008cc0008cb500352a2b1292b9008a0200c0008cc0008cb500372a2b1294b9008a0200c0008cc0008cb500392a2b1296b9008a0200c0008cc0008cb5003b2a2b1298b9008a0200c0008cc0008cb5003d2a2b129ab9008a0200c0008cc0008cb5003f2a2b129cb9008a0200c0008cc0008cb500412a2b129eb9008a0200c0008cc0008cb500432a2b12a0b9008a0200c0008cc0008cb500452a2b12a2b9008a0200c0008cc0008cb500472a2b12a4b9008a0200c0008cc0008cb500492a2b12a6b9008a0200c0008cc0008cb5004b2a2b12a8b9008a0200c0008cc0008cb5004d2a2b12aab9008a0200c0008cc0008cb5004f2a2b12acb9008a0200c0008cc0008cb500512a2b12aeb9008a0200c0008cc0008cb500532a2b12b0b9008a0200c0008cc0008cb500552a2b12b2b9008a0200c0008cc0008cb500572a2b12b4b9008a0200c0008cc0008cb500592a2b12b6b9008a0200c0008cc0008cb5005b2a2b12b8b9008a0200c0008cc0008cb5005d2a2b12bab9008a0200c0008cc0008cb5005f2a2b12bcb9008a0200c0008cc0008cb500612a2b12beb9008a0200c0008cc0008cb50063b10000000100760000006e001b0000005200120053002400540036005500480056005a0057006c0058007e00590090005a00a2005b00b4005c00c6005d00d8005e00ea005f00fc0060010e00610120006201320063014400640156006501680066017a0067018c0068019e006901b0006a01c2006b01d4006c0002007d007a0001002d0000007100030002000000492a2b12c0b9008a0200c000c2c000c2b500652a2b12c4b9008a0200c000c2c000c2b500672a2b12c6b9008a0200c000c2c000c2b500692a2b12c8b9008a0200c000c2c000c2b5006bb1000000010076000000160005000000740012007500240076003600770048007800020080007a0001002d00000087000300020000005b2a2b12cab9008a0200c000ccc000ccb5006d2a2b12ceb9008a0200c000ccc000ccb5006f2a2b12d0b9008a0200c000ccc000ccb500712a2b12d2b9008a0200c000ccc000ccb500732a2b12d4b9008a0200c000ccc000ccb50075b10000000100760000001a00060000008000120081002400820036008300480084005a0085000100d500d6000200d700000004000100d9002d0000026900030003000001b5014d1baa000001b00000000000000012000000590000006e000000830000008f0000009b000000a7000000b3000000bf000000cb000000d7000000e300000124000001410000015f0000016d0000017b0000018900000197000001a52ab40063b600ddc000df12e1b600e504324da701452ab40063b600ddc000df12e1b600e503324da70130bb00e75904b700ea4da70124bb00e75904b700ea4da70118bb00e75904b700ea4da7010cbb00e75903b700ea4da70100bb00e75904b700ea4da700f4bb00e75903b700ea4da700e8bb00e75904b700ea4da700dcbb00e75903b700ea4da700d0bb00ec5912eeb700f12ab4005fb600ddc000dfb600f512f7b600f52ab4003bb600ddc000dfb600f512f9b600f52ab40063b600ddc000dfb600f5b600fd4da7008fbb00ec5912ffb700f12ab40069b60100c000dfb600f5b600fd4da70072bb00ec59130102b700f12ab4006bb60100c000dfb600f5b600fd4da700542ab40055b600ddc001044da700462ab40065b60100c000e74da700382ab40067b60100c000e74da7002a2ab40055b600ddc001044da7001c2ab40065b60100c000e74da7000e2ab40067b60100c000e74d2cb0000000010076000000a200280000008d0002008f005c0093006e009400710098008300990086009d008f009e009200a2009b00a3009e00a700a700a800aa00ac00b300ad00b600b100bf00b200c200b600cb00b700ce00bb00d700bc00da00c000e300c100e600c5012400c6012700ca014100cb014400cf015f00d0016200d4016d00d5017000d9017b00da017e00de018900df018c00e3019700e4019a00e801a500e901a800ed01b300f50001010500d6000200d700000004000100d9002d0000026900030003000001b5014d1baa000001b00000000000000012000000590000006e000000830000008f0000009b000000a7000000b3000000bf000000cb000000d7000000e300000124000001410000015f0000016d0000017b0000018900000197000001a52ab40063b600ddc000df12e1b600e504324da701452ab40063b600ddc000df12e1b600e503324da70130bb00e75904b700ea4da70124bb00e75904b700ea4da70118bb00e75904b700ea4da7010cbb00e75903b700ea4da70100bb00e75904b700ea4da700f4bb00e75903b700ea4da700e8bb00e75904b700ea4da700dcbb00e75903b700ea4da700d0bb00ec5912eeb700f12ab4005fb600ddc000dfb600f512f7b600f52ab4003bb600ddc000dfb600f512f9b600f52ab40063b600ddc000dfb600f5b600fd4da7008fbb00ec5912ffb700f12ab40069b60108c000dfb600f5b600fd4da70072bb00ec59130102b700f12ab4006bb60108c000dfb600f5b600fd4da700542ab40055b600ddc001044da700462ab40065b60108c000e74da700382ab40067b60108c000e74da7002a2ab40055b600ddc001044da7001c2ab40065b60108c000e74da7000e2ab40067b60108c000e74d2cb0000000010076000000a20028000000fe00020100005c0104006e0105007101090083010a0086010e008f010f00920113009b0114009e011800a7011900aa011d00b3011e00b6012200bf012300c2012700cb012800ce012c00d7012d00da013100e3013200e60136012401370127013b0141013c01440140015f014101620145016d01460170014a017b014b017e014f01890150018c015401970155019a015901a5015a01a8015e01b301660001010900d6000200d700000004000100d9002d0000026900030003000001b5014d1baa000001b00000000000000012000000590000006e000000830000008f0000009b000000a7000000b3000000bf000000cb000000d7000000e300000124000001410000015f0000016d0000017b0000018900000197000001a52ab40063b600ddc000df12e1b600e504324da701452ab40063b600ddc000df12e1b600e503324da70130bb00e75904b700ea4da70124bb00e75904b700ea4da70118bb00e75904b700ea4da7010cbb00e75903b700ea4da70100bb00e75904b700ea4da700f4bb00e75903b700ea4da700e8bb00e75904b700ea4da700dcbb00e75903b700ea4da700d0bb00ec5912eeb700f12ab4005fb600ddc000dfb600f512f7b600f52ab4003bb600ddc000dfb600f512f9b600f52ab40063b600ddc000dfb600f5b600fd4da7008fbb00ec5912ffb700f12ab40069b60100c000dfb600f5b600fd4da70072bb00ec59130102b700f12ab4006bb60100c000dfb600f5b600fd4da700542ab40055b600ddc001044da700462ab40065b60100c000e74da700382ab40067b60100c000e74da7002a2ab40055b600ddc001044da7001c2ab40065b60100c000e74da7000e2ab40067b60100c000e74d2cb0000000010076000000a200280000016f00020171005c0175006e01760071017a0083017b0086017f008f018000920184009b0185009e018900a7018a00aa018e00b3018f00b6019300bf019400c2019800cb019900ce019d00d7019e00da01a200e301a300e601a7012401a8012701ac014101ad014401b1015f01b2016201b6016d01b7017001bb017b01bc017e01c0018901c1018c01c5019701c6019a01ca01a501cb01a801cf01b301d70001010a0000000200017400155f313433343339333231343332355f3637323338367400326e65742e73662e6a61737065727265706f7274732e656e67696e652e64657369676e2e4a524a61766163436f6d70696c6572);
+INSERT INTO `reports` (`id`, `file_name`, `descr`, `with_params`, `report`) VALUES
+(14, 'chessWithWords.jasper', 'Аттестация (названия)', 1, 0xaced0005737200286e65742e73662e6a61737065727265706f7274732e656e67696e652e4a61737065725265706f727400000000000027d80200034c000b636f6d70696c65446174617400164c6a6176612f696f2f53657269616c697a61626c653b4c0011636f6d70696c654e616d655375666669787400124c6a6176612f6c616e672f537472696e673b4c000d636f6d70696c6572436c61737371007e00027872002d6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173655265706f727400000000000027d802002a49001950534555444f5f53455249414c5f56455253494f4e5f55494449000c626f74746f6d4d617267696e49000b636f6c756d6e436f756e7449000d636f6c756d6e53706163696e6749000b636f6c756d6e57696474685a001069676e6f7265506167696e6174696f6e5a00136973466c6f6174436f6c756d6e466f6f7465725a0010697353756d6d6172794e6577506167655a0020697353756d6d6172795769746850616765486561646572416e64466f6f7465725a000e69735469746c654e65775061676549000a6c6566744d617267696e42000b6f7269656e746174696f6e49000a7061676548656967687449000970616765576964746842000a7072696e744f7264657249000b72696768744d617267696e490009746f704d617267696e42000e7768656e4e6f44617461547970654c000a6261636b67726f756e647400244c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5242616e643b4c000f636f6c756d6e446972656374696f6e7400334c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f52756e446972656374696f6e456e756d3b4c000c636f6c756d6e466f6f74657271007e00044c000c636f6c756d6e48656164657271007e00045b000864617461736574737400285b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52446174617365743b4c000c64656661756c745374796c657400254c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525374796c653b4c000664657461696c71007e00044c000d64657461696c53656374696f6e7400274c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5253656374696f6e3b4c0012666f726d6174466163746f7279436c61737371007e00024c000a696d706f72747353657474000f4c6a6176612f7574696c2f5365743b4c00086c616e677561676571007e00024c000e6c61737450616765466f6f74657271007e00044c000b6d61696e446174617365747400274c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52446174617365743b4c00046e616d6571007e00024c00066e6f4461746171007e00044c00106f7269656e746174696f6e56616c75657400324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4f7269656e746174696f6e456e756d3b4c000a70616765466f6f74657271007e00044c000a7061676548656164657271007e00044c000f7072696e744f7264657256616c75657400314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f5072696e744f72646572456e756d3b5b00067374796c65737400265b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525374796c653b4c000773756d6d61727971007e00045b000974656d706c6174657374002f5b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525265706f727454656d706c6174653b4c00057469746c6571007e00044c00137768656e4e6f446174615479706556616c75657400354c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f5768656e4e6f4461746154797065456e756d3b78700000c5460000001400000001000000000000032200000000000000001400000002530000034a000000001400000014007372002b6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736542616e6400000000000027d802000749001950534555444f5f53455249414c5f56455253494f4e5f5549444900066865696768745a000e697353706c6974416c6c6f7765644c00137072696e745768656e45787072657373696f6e74002a4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5245787072657373696f6e3b4c000d70726f706572746965734d617074002d4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5250726f706572746965734d61703b4c000973706c6974547970657400104c6a6176612f6c616e672f427974653b4c000e73706c69745479706556616c75657400304c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f53706c697454797065456e756d3b787200336e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365456c656d656e7447726f757000000000000027d80200024c00086368696c6472656e7400104c6a6176612f7574696c2f4c6973743b4c000c656c656d656e7447726f757074002c4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52456c656d656e7447726f75703b7870737200136a6176612e7574696c2e41727261794c6973747881d21d99c7619d03000149000473697a6578700000000077040000000078700000c54600000000017070707e72002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e53706c697454797065456e756d00000000000000001200007872000e6a6176612e6c616e672e456e756d00000000000000001200007870740007535452455443487e7200316e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e52756e446972656374696f6e456e756d00000000000000001200007871007e001d7400034c54527070757200285b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a52446174617365743b4c1a3698cdac9c440200007870000000027372002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173654461746173657400000000000027d802001149001950534555444f5f53455249414c5f56455253494f4e5f5549445a000669734d61696e4200177768656e5265736f757263654d697373696e67547970655b00066669656c64737400265b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a524669656c643b4c001066696c74657245787072657373696f6e71007e00125b000667726f7570737400265b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5247726f75703b4c00046e616d6571007e00025b000a706172616d657465727374002a5b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52506172616d657465723b4c000d70726f706572746965734d617071007e00134c000571756572797400254c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5251756572793b4c000e7265736f7572636542756e646c6571007e00024c000e7363726970746c6574436c61737371007e00025b000a7363726970746c65747374002a5b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525363726970746c65743b5b000a736f72744669656c647374002a5b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52536f72744669656c643b4c0004757569647400104c6a6176612f7574696c2f555549443b5b00097661726961626c65737400295b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525661726961626c653b4c001c7768656e5265736f757263654d697373696e675479706556616c756574003e4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f5768656e5265736f757263654d697373696e6754797065456e756d3b78700000c5460000757200265b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a524669656c643b023cdfc74e2af2700200007870000000087372002c6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173654669656c6400000000000027d80200054c000b6465736372697074696f6e71007e00024c00046e616d6571007e00024c000d70726f706572746965734d617071007e00134c000e76616c7565436c6173734e616d6571007e00024c001276616c7565436c6173735265616c4e616d6571007e000278707400007400084c6173744e616d657372002b6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5250726f706572746965734d617000000000000027d80200034c00046261736571007e00134c000e70726f706572746965734c69737471007e00174c000d70726f706572746965734d617074000f4c6a6176612f7574696c2f4d61703b78707070707400106a6176612e6c616e672e537472696e67707371007e003274000074000946697273744e616d657371007e00367070707400106a6176612e6c616e672e537472696e67707371007e003274000074000a5365636f6e644e616d657371007e00367070707400106a6176612e6c616e672e537472696e67707371007e003274000074000b5375626a656374416262727371007e00367070707400106a6176612e6c616e672e537472696e67707371007e00327400007400084578616d547970657371007e00367070707400106a6176612e6c616e672e537472696e67707371007e003274000074000b72617465526567756c61727371007e00367070707400116a6176612e6c616e672e496e7465676572707371007e003270740007537562747970657371007e00367070707400106a6176612e6c616e672e537472696e67707371007e00327074000b5375626a6563744e616d657371007e003670707071007e005670707074000f63726f7373746162446174617365747572002a5b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a52506172616d657465723b22000c8d2ac36021020000787000000014737200306e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365506172616d6574657200000000000027d80200095a000e6973466f7250726f6d7074696e675a000f697353797374656d446566696e65644c001664656661756c7456616c756545787072657373696f6e71007e00124c000b6465736372697074696f6e71007e00024c00046e616d6571007e00024c000e6e6573746564547970654e616d6571007e00024c000d70726f706572746965734d617071007e00134c000e76616c7565436c6173734e616d6571007e00024c001276616c7565436c6173735265616c4e616d6571007e000278700101707074000e5245504f52545f434f4e54455854707371007e00367070707400296e65742e73662e6a61737065727265706f7274732e656e67696e652e5265706f7274436f6e74657874707371007e005d010170707400155245504f52545f504152414d45544552535f4d4150707371007e003670707074000d6a6176612e7574696c2e4d6170707371007e005d010170707400164a41535045525f5245504f5254535f434f4e54455854707371007e00367070707400306e65742e73662e6a61737065727265706f7274732e656e67696e652e4a61737065725265706f727473436f6e74657874707371007e005d0101707074000d4a41535045525f5245504f5254707371007e00367070707400286e65742e73662e6a61737065727265706f7274732e656e67696e652e4a61737065725265706f7274707371007e005d010170707400115245504f52545f434f4e4e454354494f4e707371007e00367070707400136a6176612e73716c2e436f6e6e656374696f6e707371007e005d010170707400105245504f52545f4d41585f434f554e54707371007e00367070707400116a6176612e6c616e672e496e7465676572707371007e005d010170707400125245504f52545f444154415f534f55524345707371007e00367070707400286e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5244617461536f75726365707371007e005d010170707400105245504f52545f5343524950544c4554707371007e003670707074002f6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5241627374726163745363726970746c6574707371007e005d0101707074000d5245504f52545f4c4f43414c45707371007e00367070707400106a6176612e7574696c2e4c6f63616c65707371007e005d010170707400165245504f52545f5245534f555243455f42554e444c45707371007e00367070707400186a6176612e7574696c2e5265736f7572636542756e646c65707371007e005d010170707400105245504f52545f54494d455f5a4f4e45707371007e00367070707400126a6176612e7574696c2e54696d655a6f6e65707371007e005d010170707400155245504f52545f464f524d41545f464143544f5259707371007e003670707074002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e7574696c2e466f726d6174466163746f7279707371007e005d010170707400135245504f52545f434c4153535f4c4f41444552707371007e00367070707400156a6176612e6c616e672e436c6173734c6f61646572707371007e005d0101707074001a5245504f52545f55524c5f48414e444c45525f464143544f5259707371007e00367070707400206a6176612e6e65742e55524c53747265616d48616e646c6572466163746f7279707371007e005d010170707400145245504f52545f46494c455f5245534f4c564552707371007e003670707074002d6e65742e73662e6a61737065727265706f7274732e656e67696e652e7574696c2e46696c655265736f6c766572707371007e005d010170707400105245504f52545f54454d504c41544553707371007e00367070707400146a6176612e7574696c2e436f6c6c656374696f6e707371007e005d0101707074000b534f52545f4649454c4453707371007e003670707074000e6a6176612e7574696c2e4c697374707371007e005d0101707074000646494c544552707371007e00367070707400296e65742e73662e6a61737065727265706f7274732e656e67696e652e4461746173657446696c746572707371007e005d0100707074000767726f75704964707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e005d0100707074000573656d4964707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e00367070707372002c6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365517565727900000000000027d80200025b00066368756e6b7374002b5b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5251756572794368756e6b3b4c00086c616e677561676571007e000278707572002b5b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5251756572794368756e6b3b409f00a1e8ba34a4020000787000000013737200316e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736551756572794368756e6b00000000000027d8020004420004747970654c00047465787471007e00024c000e746f6b656e536570617261746f727400154c6a6176612f6c616e672f4368617261637465723b5b0006746f6b656e737400135b4c6a6176612f6c616e672f537472696e673b7870017401df2853454c4543542076732e4c6173744e616d65202c0a20202020202020202020202076732e46697273744e616d652c0a20202020202020202020202076732e5365636f6e644e616d652c0a202020202020202020202020766965775f6469736369706c696e65732e5375626a6563744162627220202c0a202020202020202020202020766965775f6469736369706c696e65732e5375626a6563744e616d652c0a202020202020202020202020766965775f6469736369706c696e65732e537562747970652c0a202020202020202020202020766965775f6469736369706c696e65732e4578616d547970652c0a20202020207672722e72617465526567756c61720a202020202020202046524f4d20606469736369706c696e65735f67726f757073600a2020202020202020494e4e4552204a4f494e2060766965775f6469736369706c696e657360204f4e20202020766965775f6469736369706c696e65732e4469736369706c696e654944203d206469736369706c696e65735f67726f7570732e4469736369706c696e65494420414e440a2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020766965775f6469736369706c696e65732e53656d65737465724944203d2070707371007e00b40274000573656d496470707371007e00b40174002e0a09096c656674206a6f696e20766965775f73747564656e7473207673206f6e2076732e67726f75704964203d2070707371007e00b40274000767726f7570496470707371007e00b40174001520616e642076732e73656d65737465724964203d2070707371007e00b40274000573656d496470707371007e00b4017400a90a202020202009206c656674206a6f696e20766965775f726174696e675f726573756c7420767272206f6e207672722e73747564656e746964203d2076732e73747564656e74696420616e64207672722e6469736369706c696e656964203d20766965775f6469736369706c696e65732e4469736369706c696e6549440a20202020202020205748455245206469736369706c696e65735f67726f7570732e47726f75704944203d2070707371007e00b40274000767726f7570496470707371007e00b4017402440a202020202920554e494f4e2044495354494e43540a202020202853454c4543542076732e4c6173744e616d652c0a20202020202020202020202076732e46697273744e616d652c0a20202020202020202020202076732e5365636f6e644e616d652c0a202020202020202020202020766965775f6469736369706c696e65732e5375626a6563744162627220202c0a202020202020202020202020766965775f6469736369706c696e65732e5375626a6563744e616d652c0a202020202020202020202020766965775f6469736369706c696e65732e537562747970652c0a202020202020202020202020766965775f6469736369706c696e65732e4578616d547970652c0a20202020207672722e72617465526567756c61720a202020202020202046524f4d20606469736369706c696e65735f73747564656e7473600a2020202020202020494e4e4552204a4f494e206073747564656e747360204f4e206469736369706c696e65735f73747564656e74732e53747564656e744944203d2073747564656e74732e49440a2020202020202020494e4e4552204a4f494e2060766965775f6469736369706c696e657360204f4e20766965775f6469736369706c696e65732e4469736369706c696e654944203d206469736369706c696e65735f73747564656e74732e4469736369706c696e65494420414e440a2020202020202020202020202020202020202020202020202020202020202020202020202020202020766965775f6469736369706c696e65732e53656d65737465724944203d2070707371007e00b40274000573656d496470707371007e00b40174009a0a2020202020202020494e4e4552204a4f494e206073747564656e74735f67726f75707360204f4e2073747564656e74735f67726f7570732e53747564656e744944203d2073747564656e74732e494420414e440a2020202020202020202020202020202020202020202020202020202020202020202020202020202073747564656e74735f67726f7570732e53656d65737465724944203d2070707371007e00b40274000573656d496470707371007e00b40174002e0a09096c656674206a6f696e20766965775f73747564656e7473207673206f6e2076732e67726f75704964203d2070707371007e00b40274000767726f7570496470707371007e00b40174001520616e642076732e73656d65737465724964203d2070707371007e00b40274000573656d496470707371007e00b4017400a60a2020202020206c656674206a6f696e20766965775f726174696e675f726573756c7420767272206f6e207672722e73747564656e746964203d2076732e73747564656e7469642020616e64207672722e6469736369706c696e656964203d20766965775f6469736369706c696e65732e4469736369706c696e6549440a202020202020202057484552452073747564656e74735f67726f7570732e47726f75704944203d2070707371007e00b40274000767726f7570496470707371007e00b4017400540a20202020290a6f72646572206279204c6173744e616d652c0a20202020202020202020202046697273744e616d652c0a2020202020202020202020205365636f6e644e616d650a202020202020202020202020707074000373716c707070707372000e6a6176612e7574696c2e55554944bc9903f7986d852f0200024a000c6c65617374536967426974734a000b6d6f7374536967426974737870b7ad74fc403f9f6f3e6bf0dc53764c15757200295b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a525661726961626c653b62e6837c982cb7440200007870000000057372002f6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173655661726961626c6500000000000027d802001149001950534555444f5f53455249414c5f56455253494f4e5f55494442000b63616c63756c6174696f6e42000d696e6372656d656e74547970655a000f697353797374656d446566696e65644200097265736574547970654c001063616c63756c6174696f6e56616c75657400324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f43616c63756c6174696f6e456e756d3b4c000a65787072657373696f6e71007e00124c000e696e6372656d656e7447726f75707400254c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5247726f75703b4c0012696e6372656d656e745479706556616c75657400344c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f496e6372656d656e7454797065456e756d3b4c001b696e6372656d656e746572466163746f7279436c6173734e616d6571007e00024c001f696e6372656d656e746572466163746f7279436c6173735265616c4e616d6571007e00024c0016696e697469616c56616c756545787072657373696f6e71007e00124c00046e616d6571007e00024c000a726573657447726f757071007e00e44c000e72657365745479706556616c75657400304c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f526573657454797065456e756d3b4c000e76616c7565436c6173734e616d6571007e00024c001276616c7565436c6173735265616c4e616d6571007e00027870000077ee000001007e7200306e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e43616c63756c6174696f6e456e756d00000000000000001200007871007e001d74000653595354454d70707e7200326e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e496e6372656d656e7454797065456e756d00000000000000001200007871007e001d7400044e4f4e457070737200316e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736545787072657373696f6e00000000000027d802000449000269645b00066368756e6b737400305b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5245787072657373696f6e4368756e6b3b4c000e76616c7565436c6173734e616d6571007e00024c001276616c7565436c6173735265616c4e616d6571007e0002787000000000757200305b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5245787072657373696f6e4368756e6b3b6d59cfde694ba355020000787000000001737200366e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736545787072657373696f6e4368756e6b00000000000027d8020002420004747970654c00047465787471007e00027870017400186e6577206a6176612e6c616e672e496e7465676572283129707074000b504147455f4e554d424552707e72002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e526573657454797065456e756d00000000000000001200007871007e001d7400065245504f525471007e0075707371007e00e2000077ee0000010071007e00e9707071007e00ec70707371007e00ee000000017571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e7465676572283129707074000d434f4c554d4e5f4e554d424552707e71007e00f77400045041474571007e0075707371007e00e2000077ee000001007e71007e00e8740005434f554e547371007e00ee000000027571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ec70707371007e00ee000000037571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e7465676572283029707074000c5245504f52545f434f554e547071007e00f871007e0075707371007e00e2000077ee0000010071007e01037371007e00ee000000047571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ec70707371007e00ee000000057571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e7465676572283029707074000a504147455f434f554e547071007e010071007e0075707371007e00e2000077ee0000010071007e01037371007e00ee000000067571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ec70707371007e00ee000000077571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e7465676572283029707074000c434f4c554d4e5f434f554e54707e71007e00f7740006434f4c554d4e71007e0075707e72003c6e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e5768656e5265736f757263654d697373696e6754797065456e756d00000000000000001200007871007e001d7400044e554c4c7371007e00250000c54600007571007e0030000000037371007e003274000074000c4469736369706c696e6549447371007e00367070707400116a6176612e6c616e672e496e7465676572707371007e003274000074000b5375626a6563744e616d657371007e00367070707400106a6176612e6c616e672e537472696e67707371007e00327400007400084578616d547970657371007e00367070707400106a6176612e6c616e672e537472696e6770707074000b6c697374446174617365747571007e005b000000147371007e005d0101707071007e005f707371007e003670707071007e0061707371007e005d0101707071007e0063707371007e003670707071007e0065707371007e005d0101707071007e0067707371007e003670707071007e0069707371007e005d0101707071007e006b707371007e003670707071007e006d707371007e005d0101707071007e006f707371007e003670707071007e0071707371007e005d0101707071007e0073707371007e003670707071007e0075707371007e005d0101707071007e0077707371007e003670707071007e0079707371007e005d0101707071007e007b707371007e003670707071007e007d707371007e005d0101707071007e007f707371007e003670707071007e0081707371007e005d0101707071007e0083707371007e003670707071007e0085707371007e005d0101707071007e0087707371007e003670707071007e0089707371007e005d0101707071007e008b707371007e003670707071007e008d707371007e005d0101707071007e008f707371007e003670707071007e0091707371007e005d0101707071007e0093707371007e003670707071007e0095707371007e005d0101707071007e0097707371007e003670707071007e0099707371007e005d0101707071007e009b707371007e003670707071007e009d707371007e005d0101707071007e009f707371007e003670707071007e00a1707371007e005d0101707071007e00a3707371007e003670707071007e00a5707371007e005d0100707074000767726f75704964707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e005d0100707074000573656d4964707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e00367070707371007e00af7571007e00b20000000b7371007e00b4017400c6280a202053454c4543540a2020202076642e4469736369706c696e6549442c0a2020202076642e5375626a6563744e616d652c0a2020202076642e4578616d547970650a202046524f4d0a20202020606469736369706c696e65735f67726f757073602064670a20202020494e4e4552204a4f494e2060766965775f6469736369706c696e657360207664204f4e202076642e4469736369706c696e654944203d2064672e4469736369706c696e65494420414e442076642e53656d65737465724944203d2070707371007e00b40274000573656d496470707371007e00b40174001a0a202057484552450a2020202064672e47726f75704944203d2070707371007e00b40274000767726f7570496470707371007e00b40174010c0a290a554e494f4e2044495354494e43540a280a202053454c4543540a2020202076642e4469736369706c696e6549442c0a2020202076642e5375626a6563744e616d652c0a2020202076642e4578616d547970650a202046524f4d0a20202020606469736369706c696e65735f73747564656e7473602064730a20202020494e4e4552204a4f494e206073747564656e7473602073204f4e2064732e53747564656e744944203d20732e49440a20202020494e4e4552204a4f494e2060766965775f6469736369706c696e657360207664204f4e2076642e4469736369706c696e654944203d2064732e4469736369706c696e65494420414e442076642e53656d65737465724944203d2070707371007e00b40274000573656d496470707371007e00b4017400500a20202020494e4e4552204a4f494e206073747564656e74735f67726f75707360207367204f4e2073672e53747564656e744944203d20732e494420414e442073672e53656d65737465724944203d2070707371007e00b40274000573656d496470707371007e00b40174001a0a202057484552450a2020202073672e47726f75704944203d2070707371007e00b40274000767726f7570496470707371007e00b40174001a0a290a6f726465722062790a20204469736369706c696e654944707074000373716c707070707371007e00de8ae3fbb130770e222fe3615473e947e37571007e00e0000000057371007e00e2000077ee0000010071007e00e9707071007e00ec70707371007e00ee000000007571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e7465676572283129707071007e00f67071007e00f871007e0075707371007e00e2000077ee0000010071007e00e9707071007e00ec70707371007e00ee000000017571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e7465676572283129707071007e00ff7071007e010071007e0075707371007e00e2000077ee0000010071007e01037371007e00ee000000027571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ec70707371007e00ee000000037571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e7465676572283029707071007e010d7071007e00f871007e0075707371007e00e2000077ee0000010071007e01037371007e00ee000000047571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ec70707371007e00ee000000057571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e7465676572283029707071007e01177071007e010071007e0075707371007e00e2000077ee0000010071007e01037371007e00ee000000067571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ec70707371007e00ee000000077571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e7465676572283029707071007e01217071007e012271007e00757071007e012570707372002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736553656374696f6e00000000000027d80200015b000562616e64737400255b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5242616e643b7870757200255b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a5242616e643b95dd7eec8cca85350200007870000000017371007e00117371007e001a00000001770400000001737200326e65742e73662e6a61737065727265706f7274732e63726f7373746162732e626173652e4a524261736543726f737374616200000000000027d802001549001950534555444f5f53455249414c5f56455253494f4e5f554944490011636f6c756d6e427265616b4f666673657449000269645a0013726570656174436f6c756d6e486561646572735a0010726570656174526f774865616465727342000c72756e446972656374696f6e5b000563656c6c737400315b5b4c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f4a5243726f737374616243656c6c3b5b000c636f6c756d6e47726f7570737400375b4c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f4a5243726f7373746162436f6c756d6e47726f75703b4c0007646174617365747400324c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f4a5243726f7373746162446174617365743b4c000a68656164657243656c6c74002f4c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f4a5243656c6c436f6e74656e74733b4c0012686f72697a6f6e74616c506f736974696f6e7400354c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f486f72697a6f6e74616c506f736974696f6e3b4c000b69676e6f726557696474687400134c6a6176612f6c616e672f426f6f6c65616e3b4c00076c696e65426f787400274c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a524c696e65426f783b5b00086d656173757265737400335b4c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f4a5243726f73737461624d6561737572653b5b000a706172616d65746572737400355b4c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f4a5243726f7373746162506172616d657465723b4c0017706172616d65746572734d617045787072657373696f6e71007e00125b0009726f7747726f7570737400345b4c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f4a5243726f7373746162526f7747726f75703b4c001172756e446972656374696f6e56616c756571007e00054c00097469746c6543656c6c7400334c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f43726f7373746162436f6c756d6e43656c6c3b5b00097661726961626c657371007e002d4c000e7768656e4e6f4461746143656c6c71007e01b27872002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365456c656d656e7400000000000027d802001b49001950534555444f5f53455249414c5f56455253494f4e5f5549444900066865696768745a001769735072696e74496e466972737457686f6c6542616e645a001569735072696e74526570656174656456616c7565735a001a69735072696e745768656e44657461696c4f766572666c6f77735a0015697352656d6f76654c696e655768656e426c616e6b42000c706f736974696f6e5479706542000b7374726574636854797065490005776964746849000178490001794c00096261636b636f6c6f727400104c6a6176612f6177742f436f6c6f723b4c001464656661756c745374796c6550726f76696465727400344c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5244656661756c745374796c6550726f76696465723b4c000c656c656d656e7447726f757071007e00184c0009666f7265636f6c6f7271007e01bb4c00036b657971007e00024c00046d6f646571007e00144c00096d6f646556616c756574002b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4d6f6465456e756d3b4c000b706172656e745374796c6571007e00074c0018706172656e745374796c654e616d655265666572656e636571007e00024c0011706f736974696f6e5479706556616c75657400334c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f506f736974696f6e54797065456e756d3b4c00137072696e745768656e45787072657373696f6e71007e00124c00157072696e745768656e47726f75704368616e67657371007e00e44c000d70726f706572746965734d617071007e00135b001370726f706572747945787072657373696f6e737400335b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5250726f706572747945787072657373696f6e3b4c0010737472657463685479706556616c75657400324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f5374726574636854797065456e756d3b4c00047575696471007e002c78700000c5460000002f0001000000000000032200000000000000007071007e001071007e01ac7070707070707e7200316e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e506f736974696f6e54797065456e756d00000000000000001200007871007e001d7400134649585f52454c41544956455f544f5f544f50707070707e7200306e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e5374726574636854797065456e756d00000000000000001200007871007e001d74000a4e4f5f535452455443487371007e00deb20ec12d9d3485cdda95ef9d42b94d1e0000c5460000000a00000000010100757200315b5b4c6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e4a5243726f737374616243656c6c3b3956bb3ca159754a020000787000000002757200305b4c6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e4a5243726f737374616243656c6c3b236e7b4a4c160e6a02000078700000000270737200366e65742e73662e6a61737065727265706f7274732e63726f7373746162732e626173652e4a524261736543726f737374616243656c6c00000000000027d80200054c0010636f6c756d6e546f74616c47726f757071007e00024c0008636f6e74656e747371007e01b24c00066865696768747400134c6a6176612f6c616e672f496e74656765723b4c000d726f77546f74616c47726f757071007e00024c0005776964746871007e01ce787070737200366e65742e73662e6a61737065727265706f7274732e63726f7373746162732e626173652e4a524261736543656c6c436f6e74656e747300000000000027d802000c49001950534555444f5f53455249414c5f56455253494f4e5f55494449000668656967687449000577696474684c00096261636b636f6c6f7271007e01bb4c0003626f787400234c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52426f783b4c001464656661756c745374796c6550726f766964657271007e01bc4c00076c696e65426f7871007e01b54c00046d6f646571007e00144c00096d6f646556616c756571007e01bd4c000d70726f706572746965734d617071007e00134c00057374796c6571007e00074c00127374796c654e616d655265666572656e636571007e00027871007e00167371007e001a0000000077040000000078700000c54600000000000000467372000e6a6176612e6177742e436f6c6f7201a51783108f337502000546000666616c70686149000576616c75654c0002637374001b4c6a6176612f6177742f636f6c6f722f436f6c6f7253706163653b5b00096672676276616c75657400025b465b00066676616c756571007e01d6787000000000ffbfe1ff7070707071007e00107372002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173654c696e65426f7800000000000027d802000b4c000d626f74746f6d50616464696e6771007e01ce4c0009626f74746f6d50656e74002b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f626173652f4a52426f7850656e3b4c000c626f78436f6e7461696e657274002c4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52426f78436f6e7461696e65723b4c000b6c65667450616464696e6771007e01ce4c00076c65667450656e71007e01d94c000770616464696e6771007e01ce4c000370656e71007e01d94c000c726967687450616464696e6771007e01ce4c0008726967687450656e71007e01d94c000a746f7050616464696e6771007e01ce4c0006746f7050656e71007e01d9787070737200336e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365426f78426f74746f6d50656e00000000000027d80200007872002d6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365426f7850656e00000000000027d80200014c00076c696e65426f7871007e01b57872002a6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736550656e00000000000027d802000649001950534555444f5f53455249414c5f56455253494f4e5f5549444c00096c696e65436f6c6f7271007e01bb4c00096c696e655374796c6571007e00144c000e6c696e655374796c6556616c75657400304c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4c696e655374796c65456e756d3b4c00096c696e6557696474687400114c6a6176612f6c616e672f466c6f61743b4c000c70656e436f6e7461696e657274002c4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5250656e436f6e7461696e65723b78700000c5467070707071007e01db71007e01db71007e01d270737200316e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365426f784c65667450656e00000000000027d80200007871007e01dd0000c5467070707071007e01db71007e01db707371007e01dd0000c5467371007e01d400000000ff000000707070707e72002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e4c696e655374796c65456e756d00000000000000001200007871007e001d740005534f4c49447372000f6a6176612e6c616e672e466c6f6174daedc9a2db3cf0ec02000146000576616c7565787200106a6176612e6c616e672e4e756d62657286ac951d0b94e08b02000078703f00000071007e01db71007e01db70737200326e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365426f78526967687450656e00000000000027d80200007871007e01dd0000c5467070707071007e01db71007e01db70737200306e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365426f78546f7050656e00000000000027d80200007871007e01dd0000c5467070707071007e01db71007e01db707e7200296e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e4d6f6465456e756d00000000000000001200007871007e001d7400064f5041515545707070737200116a6176612e6c616e672e496e746567657212e2a0a4f781873802000149000576616c75657871007e01eb000000007400026c6e7371007e01f4000000467571007e01cb00000002707371007e01cd707371007e01d07371007e001a00000001770400000001737200306e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365546578744669656c6400000000000027d802001549001950534555444f5f53455249414c5f56455253494f4e5f55494449000d626f6f6b6d61726b4c6576656c42000e6576616c756174696f6e54696d6542000f68797065726c696e6b54617267657442000d68797065726c696e6b547970655a0015697353747265746368576974684f766572666c6f774c0014616e63686f724e616d6545787072657373696f6e71007e00124c000f6576616c756174696f6e47726f757071007e00e44c00136576616c756174696f6e54696d6556616c75657400354c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4576616c756174696f6e54696d65456e756d3b4c000a65787072657373696f6e71007e00124c001968797065726c696e6b416e63686f7245787072657373696f6e71007e00124c001768797065726c696e6b5061676545787072657373696f6e71007e00125b001368797065726c696e6b506172616d65746572737400335b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5248797065726c696e6b506172616d657465723b4c001c68797065726c696e6b5265666572656e636545787072657373696f6e71007e00124c001a68797065726c696e6b546f6f6c74697045787072657373696f6e71007e00124c001768797065726c696e6b5768656e45787072657373696f6e71007e00124c000f6973426c616e6b5768656e4e756c6c71007e01b44c000a6c696e6b54617267657471007e00024c00086c696e6b5479706571007e00024c00077061747465726e71007e00024c00117061747465726e45787072657373696f6e71007e0012787200326e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736554657874456c656d656e7400000000000027d802002649001950534555444f5f53455249414c5f56455253494f4e5f5549444c0006626f7264657271007e00144c000b626f72646572436f6c6f7271007e01bb4c000c626f74746f6d426f7264657271007e00144c0011626f74746f6d426f72646572436f6c6f7271007e01bb4c000d626f74746f6d50616464696e6771007e01ce4c0008666f6e744e616d6571007e00024c0008666f6e7453697a6571007e01ce4c0008666f6e7473697a6571007e01e04c0013686f72697a6f6e74616c416c69676e6d656e7471007e00144c0018686f72697a6f6e74616c416c69676e6d656e7456616c75657400364c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f486f72697a6f6e74616c416c69676e456e756d3b4c00066973426f6c6471007e01b44c000869734974616c696371007e01b44c000d6973506466456d62656464656471007e01b44c000f6973537472696b655468726f75676871007e01b44c000c69735374796c65645465787471007e01b44c000b6973556e6465726c696e6571007e01b44c000a6c656674426f7264657271007e00144c000f6c656674426f72646572436f6c6f7271007e01bb4c000b6c65667450616464696e6771007e01ce4c00076c696e65426f7871007e01b54c000b6c696e6553706163696e6771007e00144c00106c696e6553706163696e6756616c75657400324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4c696e6553706163696e67456e756d3b4c00066d61726b757071007e00024c000770616464696e6771007e01ce4c00097061726167726170687400294c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525061726167726170683b4c000b706466456e636f64696e6771007e00024c000b706466466f6e744e616d6571007e00024c000b7269676874426f7264657271007e00144c00107269676874426f72646572436f6c6f7271007e01bb4c000c726967687450616464696e6771007e01ce4c0008726f746174696f6e71007e00144c000d726f746174696f6e56616c756574002f4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f526f746174696f6e456e756d3b4c0009746f70426f7264657271007e00144c000e746f70426f72646572436f6c6f7271007e01bb4c000a746f7050616464696e6771007e01ce4c0011766572746963616c416c69676e6d656e7471007e00144c0016766572746963616c416c69676e6d656e7456616c75657400344c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f566572746963616c416c69676e456e756d3b7871007e01ba0000c546000000110001000000000000004600000000000000007071007e001071007e01fa707070707372002c6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173655374796c65000000000000271102003b49001950534555444f5f53455249414c5f56455253494f4e5f5549445a0009697344656661756c744c00096261636b636f6c6f7271007e01bb4c0006626f7264657271007e00144c000b626f72646572436f6c6f7271007e01bb4c000c626f74746f6d426f7264657271007e00144c0011626f74746f6d426f72646572436f6c6f7271007e01bb4c000d626f74746f6d50616464696e6771007e01ce5b0011636f6e646974696f6e616c5374796c65737400315b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52436f6e646974696f6e616c5374796c653b4c001464656661756c745374796c6550726f766964657271007e01bc4c000466696c6c71007e00144c000966696c6c56616c756574002b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f46696c6c456e756d3b4c0008666f6e744e616d6571007e00024c0008666f6e7453697a6571007e01ce4c0008666f6e7473697a6571007e01e04c0009666f7265636f6c6f7271007e01bb4c0013686f72697a6f6e74616c416c69676e6d656e7471007e00144c0018686f72697a6f6e74616c416c69676e6d656e7456616c756571007e02004c000f6973426c616e6b5768656e4e756c6c71007e01b44c00066973426f6c6471007e01b44c000869734974616c696371007e01b44c000d6973506466456d62656464656471007e01b44c000f6973537472696b655468726f75676871007e01b44c000c69735374796c65645465787471007e01b44c000b6973556e6465726c696e6571007e01b44c000a6c656674426f7264657271007e00144c000f6c656674426f72646572436f6c6f7271007e01bb4c000b6c65667450616464696e6771007e01ce4c00076c696e65426f7871007e01b54c00076c696e6550656e7400234c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5250656e3b4c000b6c696e6553706163696e6771007e00144c00106c696e6553706163696e6756616c756571007e02014c00066d61726b757071007e00024c00046d6f646571007e00144c00096d6f646556616c756571007e01bd4c00046e616d6571007e00024c000770616464696e6771007e01ce4c000970617261677261706871007e02024c000b706172656e745374796c6571007e00074c0018706172656e745374796c654e616d655265666572656e636571007e00024c00077061747465726e71007e00024c000b706466456e636f64696e6771007e00024c000b706466466f6e744e616d6571007e00024c000370656e71007e00144c000c706f736974696f6e5479706571007e00144c000672616469757371007e01ce4c000b7269676874426f7264657271007e00144c00107269676874426f72646572436f6c6f7271007e01bb4c000c726967687450616464696e6771007e01ce4c0008726f746174696f6e71007e00144c000d726f746174696f6e56616c756571007e02034c000a7363616c65496d61676571007e00144c000f7363616c65496d61676556616c75657400314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f5363616c65496d616765456e756d3b4c000b737472657463685479706571007e00144c0009746f70426f7264657271007e00144c000e746f70426f72646572436f6c6f7271007e01bb4c000a746f7050616464696e6771007e01ce4c0011766572746963616c416c69676e6d656e7471007e00144c0016766572746963616c416c69676e6d656e7456616c756571007e020478700000c546007070707070707070707070707070707e7200346e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e486f72697a6f6e74616c416c69676e456e756d00000000000000001200007871007e001d74000643454e544552707070707070707070707371007e01d8707371007e01dc0000c5467070707071007e020f71007e020f71007e020b707371007e01e30000c5467070707071007e020f71007e020f707371007e01dd0000c5467070707071007e020f71007e020f707371007e01ed0000c5467070707071007e020f71007e020f707371007e01ef0000c5467070707071007e020f71007e020f7371007e01de0000c5467070707071007e020b707070707074001243726f73737461622044617461205465787470737200306e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736550617261677261706800000000000027d802000a4c000f66697273744c696e65496e64656e7471007e01ce4c000a6c656674496e64656e7471007e01ce4c000b6c696e6553706163696e6771007e02014c000f6c696e6553706163696e6753697a6571007e01e04c0012706172616772617068436f6e7461696e65727400324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a52506172616772617068436f6e7461696e65723b4c000b7269676874496e64656e7471007e01ce4c000c73706163696e67416674657271007e01ce4c000d73706163696e674265666f726571007e01ce4c000c74616253746f70576964746871007e01ce4c000874616253746f707371007e001778707070707071007e020b70707070707070707070707070707070707070707070707070707071007e01c37070707071007e01c67371007e00de9be9775ea58520c5690c23d5d68843750000c5467070707070740005417269616c707070707070707070707070707371007e01d8707371007e01dc0000c5467070707071007e021c71007e021c71007e0205707371007e01e30000c5467070707071007e021c71007e021c707371007e01dd0000c5467070707071007e021c71007e021c707371007e01ed0000c5467070707071007e021c71007e021c707371007e01ef0000c5467070707071007e021c71007e021c707070707371007e02177070707071007e0205707070707070707070707070707070707e7200326e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e566572746963616c416c69676e456e756d00000000000000001200007871007e001d7400064d4944444c450000c546000000000000000070707e7200336e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e4576616c756174696f6e54696d65456e756d00000000000000001200007871007e001d7400034e4f577371007e00ee000000027571007e00f1000000057371007e00f30474000b726174654d6561737572657371007e00f30174000c203d3d206e756c6c207c7c207371007e00f30474000b726174654d6561737572657371007e00f30174000d203c2030203f20222d22203a207371007e00f30474000b726174654d6561737572657070707070707070707070707078700000c5460000001100000046707071007e00107371007e01d8707371007e01dc0000c5467070707071007e023571007e023571007e01fa707371007e01e30000c5467070707071007e023571007e0235707371007e01dd0000c5467371007e01d400000000ff0000007070707071007e01e87371007e01ea3f00000071007e023571007e0235707371007e01ed0000c5467070707071007e023571007e0235707371007e01ef0000c5467070707071007e023571007e023570707070707371007e01f4000000117071007e01f7757200375b4c6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e4a5243726f7373746162436f6c756d6e47726f75703bcd9b5e4c263f69320200007870000000017372003d6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e626173652e4a524261736543726f7373746162436f6c756d6e47726f757000000000000027d802000549001950534555444f5f53455249414c5f56455253494f4e5f554944490006686569676874420008706f736974696f6e4c000e63726f737374616248656164657271007e01b24c000d706f736974696f6e56616c75657400404c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f747970652f43726f7373746162436f6c756d6e506f736974696f6e456e756d3b787200376e65742e73662e6a61737065727265706f7274732e63726f7373746162732e626173652e4a524261736543726f737374616247726f75706aa6a7928edd3f6502000849001950534555444f5f53455249414c5f56455253494f4e5f55494442000d746f74616c506f736974696f6e4c00066275636b65747400314c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f4a5243726f73737461624275636b65743b4c000668656164657271007e01b24c00046e616d6571007e00024c000b746f74616c48656164657271007e01b24c0012746f74616c506f736974696f6e56616c756574003f4c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f747970652f43726f7373746162546f74616c506f736974696f6e456e756d3b4c00087661726961626c657400284c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a525661726961626c653b78700000c54600737200386e65742e73662e6a61737065727265706f7274732e63726f7373746162732e626173652e4a524261736543726f73737461624275636b657400000000000027d802000a49001950534555444f5f53455249414c5f56455253494f4e5f5549444200056f726465724c000b6275636b65744f7264657274003b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f616e616c79746963732f646174617365742f4275636b65744f726465723b4c0014636f6d70617261746f7245787072657373696f6e71007e00124c000a65787072657373696f6e71007e00124c00116f72646572427945787072657373696f6e71007e00124c000a6f7264657256616c75657400304c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f536f72744f72646572456e756d3b4c000a76616c7565436c6173737400114c6a6176612f6c616e672f436c6173733b4c000e76616c7565436c6173734e616d6571007e00024c001276616c7565436c6173735265616c4e616d6571007e000278700000c546007e7200396e65742e73662e6a61737065727265706f7274732e656e67696e652e616e616c79746963732e646174617365742e4275636b65744f7264657200000000000000001200007871007e001d740009415343454e44494e47707371007e00ee000000097571007e00f1000000077371007e00f30374000b5375626a656374416262727371007e00f30174000c203d3d206e756c6c207c7c207371007e00f30374000b5375626a656374416262727371007e00f30174000d2e6973456d7074792829203f207371007e00f30374000b5375626a6563744e616d657371007e00f301740003203a207371007e00f30374000b5375626a656374416262727070707e72002e6e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e536f72744f72646572456e756d00000000000000001200007871007e001d740009415343454e44494e47707400106a6176612e6c616e672e537472696e67707371007e01d07371007e001a000000017704000000017371007e01fc0000c546000000320001000000000000004600000000000000007071007e001071007e02637070707071007e020b7071007e01c37070707071007e01c67371007e00de8a0d1306e2cd8cfb391c1d27b0924fc20000c5467070707070740005417269616c707070707070707070707070707371007e01d8707371007e01dc0000c5467070707371007e01ea3f00000071007e026871007e026871007e0265707371007e01e30000c5467070707371007e01ea3f00000071007e026871007e0268707371007e01dd0000c5467070707071007e026871007e0268707371007e01ed0000c5467070707371007e01ea3f00000071007e026871007e0268707371007e01ef0000c5467070707371007e01ea3f00000071007e026871007e0268707070707371007e02177070707071007e02657070707070707070707070707070707071007e02240000c5460000000000000000707071007e02277371007e00ee000000017571007e00f1000000017371007e00f30474000a6469736369704e616d657070707070707070707070707078700000c5460000003200000046707071007e00107371007e01d8707371007e01dc0000c5467070707071007e027771007e027771007e0263707371007e01e30000c5467070707071007e027771007e0277707371007e01dd0000c5467070707071007e027771007e0277707371007e01ed0000c5467070707071007e027771007e0277707371007e01ef0000c5467070707071007e027771007e0277707070707074000a6469736369704e616d657371007e01d07371007e001a0000000077040000000078700000c5468000000080000000707071007e00107371007e01d8707371007e01dc0000c5467070707071007e028071007e028071007e027e707371007e01e30000c5467070707071007e028071007e0280707371007e01dd0000c5467070707071007e028071007e0280707371007e01ed0000c5467070707071007e028071007e0280707371007e01ef0000c5467070707071007e028071007e028070707070707e72003d6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e747970652e43726f7373746162546f74616c506f736974696f6e456e756d00000000000000001200007871007e001d7400044e4f4e457371007e00e2000077ee0000010071007e00e9707071007e00ec70707071007e027d7071007e00f871007e0262700000c5460000003200707e72003e6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e747970652e43726f7373746162436f6c756d6e506f736974696f6e456e756d00000000000000001200007871007e001d7400044c454654737200396e65742e73662e6a61737065727265706f7274732e63726f7373746162732e626173652e4a524261736543726f73737461624461746173657400000000000027d80200015a000d64617461507265536f72746564787200356e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a5242617365456c656d656e744461746173657400000000000027d802000949001950534555444f5f53455249414c5f56455253494f4e5f55494442000d696e6372656d656e74547970654200097265736574547970654c000a6461746173657452756e74002a4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a524461746173657452756e3b4c000e696e6372656d656e7447726f757071007e00e44c0012696e6372656d656e745479706556616c756571007e00e54c0017696e6372656d656e745768656e45787072657373696f6e71007e00124c000a726573657447726f757071007e00e44c000e72657365745479706556616c756571007e00e67870000077ee0000737200316e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173654461746173657452756e00000000000027d80200084c0014636f6e6e656374696f6e45787072657373696f6e71007e00124c001464617461536f7572636545787072657373696f6e71007e00124c000b646174617365744e616d6571007e00025b000a706172616d65746572737400315b4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f4a5244617461736574506172616d657465723b4c0017706172616d65746572734d617045787072657373696f6e71007e00124c000d70726f706572746965734d617071007e00134c000c72657475726e56616c75657371007e00174c00047575696471007e002c78707371007e00ee0000000d7571007e00f1000000017371007e00f3027400115245504f52545f434f4e4e454354494f4e70707074000f63726f7373746162446174617365747572003a5b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736544617461736574506172616d657465723b2413b76c659575a5020000787000000002737200376e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736544617461736574506172616d6574657200000000000027d80200024c000a65787072657373696f6e71007e00124c00046e616d6571007e000278707371007e00ee0000000e7571007e00f1000000017371007e00f30374000767726f75704964707074000767726f757049647371007e029b7371007e00ee0000000f7571007e00f1000000017371007e00f30374000573656d4964707074000573656d49647070707371007e00de903506ad280ed63a2a010b261e9e41687071007e00ec707071007e00f8007371007e01d07371007e001a000000037704000000037372002b6e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173654c696e6500000000000027d802000349001950534555444f5f53455249414c5f56455253494f4e5f554944420009646972656374696f6e4c000e646972656374696f6e56616c75657400344c6e65742f73662f6a61737065727265706f7274732f656e67696e652f747970652f4c696e65446972656374696f6e456e756d3b787200356e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a524261736547726170686963456c656d656e7400000000000027d802000549001950534555444f5f53455249414c5f56455253494f4e5f5549444c000466696c6c71007e00144c000966696c6c56616c756571007e02084c00076c696e6550656e71007e02094c000370656e71007e00147871007e01ba0000c546000000320001000000000000006900000000000000007071007e001071007e02a97070707071007e020b7071007e01c37070707071007e01c67371007e00de9ec3bf24d381d93a359c07b13c354558000077ee70707371007e01de0000c5467070707071007e02ae700000c546007e7200326e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e4c696e65446972656374696f6e456e756d00000000000000001200007871007e001d740008544f505f444f574e737200316e65742e73662e6a61737065727265706f7274732e656e67696e652e626173652e4a52426173655374617469635465787400000000000027d80200014c00047465787471007e00027871007e01ff0000c546000000190001000000000000006900000000000000007071007e001071007e02a97070707071007e020b7071007e01c37070707071007e01c67371007e00debbd29fdbaf9f78306f97116d404445260000c5467070707070740005417269616c707371007e01ea41200000707e71007e020c74000552494748547070707070707070707371007e01d8707371007e01dc0000c5467070707071007e02bb71007e02bb71007e02b5707371007e01e30000c5467070707371007e01ea3f00000071007e02bb71007e02bb707371007e01dd0000c5467070707071007e02bb71007e02bb7371007e01f4000000017371007e01ed0000c5467070707071007e02bb71007e02bb707371007e01ef0000c5467070707371007e01ea3f00000071007e02bb71007e02bb707070707371007e02177070707071007e02b57070707070707070707070707070707071007e0224740014d094d0b8d181d186d0b8d0bfd0bbd0b8d0bdd18b7371007e02b40000c546000000190001000000000000006900000000000000197071007e001071007e02a97070707071007e020b7071007e01c37070707071007e01c67371007e00de9c8e5ede8c60f3d28b258f960d324dde0000c5467070707070740005417269616c707371007e01ea41200000707e71007e020c7400044c4546547070707070707070707371007e01d8707371007e01dc0000c5467070707071007e02cc71007e02cc71007e02c67371007e01f4000000037371007e01e30000c5467070707371007e01ea3f00000071007e02cc71007e02cc707371007e01dd0000c5467070707071007e02cc71007e02cc707371007e01ed0000c5467070707071007e02cc71007e02cc707371007e01ef0000c5467070707071007e02cc71007e02cc707070707371007e02177070707071007e02c67070707070707070707070707070707071007e0224740009d0a42ed0982ed09e2e78700000c5460000003200000069707071007e00107371007e01d8707371007e01dc0000c5467070707071007e02d671007e02d671007e02a9707371007e01e30000c5467070707071007e02d671007e02d6707371007e01dd0000c5467070707071007e02d671007e02d6707371007e01ed0000c5467070707071007e02d671007e02d6707371007e01ef0000c5467070707071007e02d671007e02d6707070707070737200116a6176612e6c616e672e426f6f6c65616ecd207280d59cfaee0200015a000576616c75657870007371007e01d871007e01f57371007e01dc0000c5467070707071007e02de71007e02de71007e01c171007e01f57371007e01e30000c5467070707071007e02de71007e02de707371007e01dd0000c5467070707071007e02de71007e02de71007e01f57371007e01ed0000c5467070707071007e02de71007e02de71007e01f57371007e01ef0000c5467070707071007e02de71007e02de757200335b4c6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e4a5243726f73737461624d6561737572653b2f9461b264b12588020000787000000001737200396e65742e73662e6a61737065727265706f7274732e63726f7373746162732e626173652e4a524261736543726f73737461624d65617375726500000000000027d802001149001950534555444f5f53455249414c5f56455253494f4e5f55494442000b63616c63756c6174696f6e42001070657263656e746167654f66547970654c001063616c63756c6174696f6e56616c756571007e00e34c000a65787072657373696f6e71007e00124c0017696e6372656d656e746572466163746f7279436c61737371007e024a4c001b696e6372656d656e746572466163746f7279436c6173734e616d6571007e00024c001f696e6372656d656e746572466163746f7279436c6173735265616c4e616d6571007e00024c00046e616d6571007e00024c001970657263656e7461676543616c63756c61746f72436c61737371007e024a4c001d70657263656e7461676543616c63756c61746f72436c6173734e616d6571007e00024c002170657263656e7461676543616c63756c61746f72436c6173735265616c4e616d6571007e00024c000e70657263656e746167655479706574003c4c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f747970652f43726f737374616250657263656e74616765456e756d3b4c000a76616c7565436c61737371007e024a4c000e76616c7565436c6173734e616d6571007e00024c001276616c7565436c6173735265616c4e616d6571007e00024c00087661726961626c6571007e024578700000c54600007e71007e00e87400074e4f5448494e477371007e00ee0000000a7571007e00f1000000017371007e00f30374000b72617465526567756c6172707070707074000b726174654d6561737572657070707e72003a6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e747970652e43726f737374616250657263656e74616765456e756d00000000000000001200007871007e001d7400044e4f4e45707400116a6176612e6c616e672e496e7465676572707371007e00e2000077ee0000010071007e00e9707071007e00ec70707071007e02ef7071007e00f871007e02f370757200355b4c6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e4a5243726f7373746162506172616d657465723bebb3be7dace371a60200007870000000097372003b6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e626173652e4a524261736543726f7373746162506172616d6574657200000000000027d80200014c000f76616c756545787072657373696f6e71007e00127871007e005d0101707071007e005f707371007e003670707071007e006170707371007e02f70101707071007e0063707371007e003670707071007e006570707371007e02f70101707071007e007f707371007e003670707071007e008170707371007e02f70101707071007e0083707371007e003670707071007e008570707371007e02f70101707071007e0087707371007e003670707071007e008970707371007e02f70101707071007e008b707371007e003670707071007e008d70707371007e02f70101707071007e008f707371007e003670707071007e009170707371007e02f70101707071007e0093707371007e003670707071007e009570707371007e02f70101707071007e0097707371007e003670707071007e0099707070757200345b4c6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e4a5243726f7373746162526f7747726f75703bb7ef2732ac341dbd0200007870000000017372003a6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e626173652e4a524261736543726f7373746162526f7747726f757000000000000027d802000449001950534555444f5f53455249414c5f56455253494f4e5f554944420008706f736974696f6e49000577696474684c000d706f736974696f6e56616c756574003d4c6e65742f73662f6a61737065727265706f7274732f63726f7373746162732f747970652f43726f7373746162526f77506f736974696f6e456e756d3b7871007e02420000c546007371007e02470000c5460071007e024d707371007e00ee000000087571007e00f10000000e7371007e00f3037400084c6173744e616d657371007e00f30174000b202b20222022202b0a28287371007e00f30374000946697273744e616d657371007e00f30174000c203d3d206e756c6c207c7c207371007e00f30374000946697273744e616d657371007e00f3017400142e6973456d707479282929203f202222203a20287371007e00f30374000946697273744e616d657371007e00f30174001d2e737562737472696e6728302c203129202b20222e222929202b0a28287371007e00f30374000a5365636f6e644e616d657371007e00f30174000c203d3d206e756c6c207c7c207371007e00f30374000a5365636f6e644e616d657371007e00f3017400142e6973456d707479282929203f202222203a20287371007e00f30374000a5365636f6e644e616d657371007e00f3017400182e737562737472696e6728302c203129202b20222e22292970707071007e0260707400106a6176612e6c616e672e537472696e67707371007e01d07371007e001a000000017704000000017371007e01fc0000c546000000110001000000000000006900000000000000007071007e001071007e032f7070707071007e020b7071007e01c37070707071007e01c67371007e00deac4ddd0e461a9ac2f9e31690e1a243910000c5467070707070740005417269616c70707071007e02ca7070707070707070707371007e01d8707371007e01dc0000c5467070707071007e033471007e033471007e033171007e02ce7371007e01e30000c5467070707071007e033471007e0334707371007e01dd0000c5467070707071007e033471007e0334707371007e01ed0000c5467070707071007e033471007e0334707371007e01ef0000c5467070707071007e033471007e0334707070707371007e02177070707071007e03317070707070707070707070707070707071007e02240000c5460000000000000000707071007e02277371007e00ee000000007571007e00f1000000017371007e00f3047400026c6e7070707070707070707070707078700000c54600000011000000697371007e01d400000000ffffffff7070707071007e00107371007e01d8707371007e01dc0000c5467070707071007e034071007e034071007e032f707371007e01e30000c5467070707071007e034071007e0340707371007e01dd0000c5467371007e01d400000000ff0000007070707071007e01e87371007e01ea3f00000071007e034071007e0340707371007e01ed0000c5467070707071007e034071007e0340707371007e01ef0000c5467070707071007e034071007e03407071007e01f27070707400026c6e7371007e01d07371007e001a0000000077040000000078700000c54600000000000000697371007e01d400000000ffbfe1ff7070707071007e00107371007e01d8707371007e01dc0000c5467070707071007e034c71007e034c71007e0349707371007e01e30000c5467070707071007e034c71007e034c707371007e01dd0000c5467371007e01d400000000ff0000007070707071007e01e87371007e01ea3f00000071007e034c71007e034c707371007e01ed0000c5467070707071007e034c71007e034c707371007e01ef0000c5467070707071007e034c71007e034c7071007e01f27070707e71007e0286740003454e447371007e00e2000077ee0000010071007e00e9707071007e00ec70707071007e03487071007e00f871007e032e700000c54600000000697e72003b6e65742e73662e6a61737065727265706f7274732e63726f7373746162732e747970652e43726f7373746162526f77506f736974696f6e456e756d00000000000000001200007871007e001d740003544f5071007e0021707571007e00e0000000087371007e00e2000077ee0000010071007e00e9707071007e00ec707070740009524f575f434f554e547071007e00f871007e0075707371007e00e2000077ee0000010071007e00e9707071007e00ec70707071007e01217071007e00f871007e00757071007e035671007e028971007e02f47371007e00e2000077ee0000010071007e00e9707071007e00ec70707074001a726174654d6561737572655f6469736369704e616d655f414c4c7071007e00f871007e02f3707371007e00e2000077ee0000010071007e00e9707071007e00ec707070740012726174654d6561737572655f6c6e5f414c4c7071007e00f871007e02f3707371007e00e2000077ee0000010071007e00e9707071007e00ec70707074001d726174654d6561737572655f6c6e5f6469736369704e616d655f414c4c7071007e00f871007e02f3707078700000c5460000002f0170707071007e001e70707400046a617661707371007e00250000c54601007571007e0030000000047371007e00327074000767726f757049647371007e00367070707400116a6176612e6c616e672e496e7465676572707371007e003270740008737065634e616d657371007e00367070707400106a6176612e6c616e672e537472696e67707371007e0032707400076661634e616d657371007e00367070707400106a6176612e6c616e672e537472696e67707371007e00327074000573656d49647371007e00367070707400116a6176612e6c616e672e496e746567657270707074000f63686573735769746849576f7264737571007e005b0000001a7371007e005d0101707071007e005f707371007e003670707071007e0061707371007e005d0101707071007e0063707371007e003670707071007e0065707371007e005d0101707071007e0067707371007e003670707071007e0069707371007e005d0101707071007e006b707371007e003670707071007e006d707371007e005d0101707071007e006f707371007e003670707071007e0071707371007e005d0101707071007e0073707371007e003670707071007e0075707371007e005d0101707071007e0077707371007e003670707071007e0079707371007e005d0101707071007e007b707371007e003670707071007e007d707371007e005d0101707071007e007f707371007e003670707071007e0081707371007e005d0101707071007e0083707371007e003670707071007e0085707371007e005d0101707071007e0087707371007e003670707071007e0089707371007e005d0101707071007e008b707371007e003670707071007e008d707371007e005d0101707071007e008f707371007e003670707071007e0091707371007e005d0101707071007e0093707371007e003670707071007e0095707371007e005d0101707071007e0097707371007e003670707071007e0099707371007e005d0101707071007e009b707371007e003670707071007e009d707371007e005d0101707071007e009f707371007e003670707071007e00a1707371007e005d0101707071007e00a3707371007e003670707071007e00a5707371007e005d010170707400125245504f52545f5649525455414c495a4552707371007e00367070707400296e65742e73662e6a61737065727265706f7274732e656e67696e652e4a525669727475616c697a6572707371007e005d0101707074001449535f49474e4f52455f504147494e4154494f4e707371007e00367070707400116a6176612e6c616e672e426f6f6c65616e707371007e005d0100707074000867726f75704e756d707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e005d01007070740009636f757273654e756d707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e005d01007070740006646567726565707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e005d0100707074000873656d6573746572707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e005d01007371007e00ee000000007571007e00f1000000027371007e00f30274000873656d65737465727371007e00f3017400112e73706c69742820222c202220295b315d70707074000673656d4e756d707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e005d01007371007e00ee000000017571007e00f1000000027371007e00f30274000873656d65737465727371007e00f3017400102e73706c69742820222c2022295b305d70707074000773656d59656172707371007e00367070707400106a6176612e6c616e672e537472696e67707371007e0036707371007e001a0000000377040000000374000c697265706f72742e7a6f6f6d740009697265706f72742e78740009697265706f72742e7978737200116a6176612e7574696c2e486173684d61700507dac1c31660d103000246000a6c6f6164466163746f724900097468726573686f6c6478703f400000000000037708000000040000000371007e03cd7400013071007e03cb740003312e3571007e03cc74000130787371007e00af7571007e00b20000000a7371007e00b40174006973656c6563740a09735f672e49642061732067726f757049642c20732e6e616d6520617320737065634e616d652c20662e6e616d65206173206661634e616d652c202873656c6563742069642066726f6d2073656d657374657273207768657265206079656172603d70707371007e00b40274000773656d5965617270707371007e00b40174000920616e64206e756d3d70707371007e00b40274000673656d4e756d70707371007e00b4017400c4292061732073656d49640a66726f6d0a0973747564795f67726f75707320735f670a202020206a6f696e206772616465732067206f6e20735f672e67726164654964203d20672e69640a202020206a6f696e207370656369616c697a6174696f6e732073206f6e20735f672e7370656369616c697a6174696f6e4964203d20732e69640a202020206a6f696e20666163756c746965732066206f6e20732e666163756c74794964203d20662e69640a776865726520735f672e47726f75704e756d203d2070707371007e00b40274000867726f75704e756d70707371007e00b40174000d20616e6420672e4e756d203d2070707371007e00b402740009636f757273654e756d70707371007e00b40174001d20616e6420662e4944203d203120616e6420672e646567726565203d2070707371007e00b402740006646567726565707071007e017f707070707371007e00de94efc263d1c86e9954aa3831a12748d17571007e00e0000000057371007e00e2000077ee0000010071007e00e9707071007e00ec70707371007e00ee000000027571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e7465676572283129707071007e00f67071007e00f871007e0075707371007e00e2000077ee0000010071007e00e9707071007e00ec70707371007e00ee000000037571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e7465676572283129707071007e00ff7071007e010071007e0075707371007e00e2000077ee0000010071007e01037371007e00ee000000047571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ec70707371007e00ee000000057571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e7465676572283029707071007e010d7071007e00f871007e0075707371007e00e2000077ee0000010071007e01037371007e00ee000000067571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ec70707371007e00ee000000077571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e7465676572283029707071007e01177071007e010071007e0075707371007e00e2000077ee0000010071007e01037371007e00ee000000087571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e746567657228312970707071007e00ec70707371007e00ee000000097571007e00f1000000017371007e00f3017400186e6577206a6176612e6c616e672e496e7465676572283029707071007e01217071007e012271007e00757071007e012571007e0377707e7200306e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e4f7269656e746174696f6e456e756d00000000000000001200007871007e001d7400094c414e44534341504570707e72002f6e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e5072696e744f72646572456e756d00000000000000001200007871007e001d740008564552544943414c757200265b4c6e65742e73662e6a61737065727265706f7274732e656e67696e652e4a525374796c653bd49cc311d905723502000078700000000171007e020b70707371007e00117371007e001a000000037704000000037371007e01fc0000c546000000160001000000000000032200000000000000167071007e001071007e041870707070707071007e01c37070707071007e01c67371007e00dea2cf579c37835445ac7f80c7465e43530000c5467070707070740005417269616c707371007e01ea4140000070707070707070707070707371007e01d8707371007e01dc0000c5467070707071007e041e71007e041e71007e041a707371007e01e30000c5467070707071007e041e71007e041e707371007e01dd0000c5467070707071007e041e71007e041e707371007e01ed0000c5467070707071007e041e71007e041e707371007e01ef0000c5467070707071007e041e71007e041e707070707371007e02177070707071007e041a7070707070707070707070707070707071007e02240000c5460000000000000000707071007e02277371007e00ee0000000a7571007e00f1000000067371007e00f30174000e22d09ad183d180d1812022202b207371007e00f302740009636f757273654e756d7371007e00f301740017202b20222c20d0b3d180d183d0bfd0bfd0b02022202b207371007e00f30274000867726f75704e756d7371007e00f301740019202b20222c20d181d0b5d0bcd0b5d181d182d1802022202b207371007e00f30274000873656d6573746572707070707070707070707070707371007e01fc0000c5460000001600010000000000000322000000000000002c7071007e001071007e041870707070707071007e01c37070707071007e01c67371007e00deab50a6c47b21d0bc0fb8663cb4594c890000c5467070707070740005417269616c707371007e01ea4140000070707070707070707070707371007e01d8707371007e01dc0000c5467070707071007e043771007e043771007e0433707371007e01e30000c5467070707071007e043771007e0437707371007e01dd0000c5467070707071007e043771007e0437707371007e01ed0000c5467070707071007e043771007e0437707371007e01ef0000c5467070707071007e043771007e0437707070707371007e02177070707071007e04337070707070707070707070707070707071007e02240000c5460000000000000000707071007e02277371007e00ee0000000b7571007e00f1000000027371007e00f30174002122d0a1d0bfd0b5d186d0b8d0b0d0bbd18cd0bdd0bed181d182d18c3a2022202b207371007e00f303740008737065634e616d65707070707070707070707070707371007e01fc0000c546000000160001000000000000032200000000000000007071007e001071007e041870707070707071007e01c37070707071007e01c67371007e00de966f2647b809a18837a11cbdf5414f550000c5467070707070740005417269616c707371007e01ea4140000070707070707070707070707371007e01d8707371007e01dc0000c5467070707071007e044871007e044871007e0444707371007e01e30000c5467070707071007e044871007e0448707371007e01dd0000c5467070707071007e044871007e0448707371007e01ed0000c5467070707071007e044871007e0448707371007e01ef0000c5467070707071007e044871007e0448707070707371007e02177070707071007e04447070707070707070707070707070707071007e02240000c5460000000000000000707071007e02277371007e00ee0000000c7571007e00f1000000027371007e00f30174001922d0a4d0b0d0bad183d0bbd18cd182d0b5d1823a2022202b207371007e00f3037400076661634e616d657070707070707070707070707078700000c546000000420170707071007e001e7e7200336e65742e73662e6a61737065727265706f7274732e656e67696e652e747970652e5768656e4e6f4461746154797065456e756d00000000000000001200007871007e001d7400084e4f5f5041474553737200366e65742e73662e6a61737065727265706f7274732e656e67696e652e64657369676e2e4a525265706f7274436f6d70696c654461746100000000000027d80200034c001363726f7373746162436f6d70696c654461746171007e00374c001264617461736574436f6d70696c654461746171007e00374c00166d61696e44617461736574436f6d70696c654461746171007e000178707371007e03ce3f4000000000000c7708000000100000000171007e01f5757200025b42acf317f8060854e0020000787000000bdbcafebabe0000002e008b01002e63686573735769746849576f7264735f43524f5353544142305f313433343339343038353733385f37303734333207000101002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a524576616c7561746f72070003010017706172616d657465725f5245504f52545f4c4f43414c450100324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d657465723b01001f706172616d657465725f5245504f52545f464f524d41545f464143544f525901001a706172616d657465725f5245504f52545f54494d455f5a4f4e4501001e706172616d657465725f5245504f52545f46494c455f5245534f4c56455201001f706172616d657465725f5245504f52545f504152414d45544552535f4d4150010018706172616d657465725f5245504f52545f434f4e5445585401001d706172616d657465725f5245504f52545f434c4153535f4c4f41444552010024706172616d657465725f5245504f52545f55524c5f48414e444c45525f464143544f5259010020706172616d657465725f5245504f52545f5245534f555243455f42554e444c450100127661726961626c655f524f575f434f554e540100314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c653b0100157661726961626c655f434f4c554d4e5f434f554e5401000b7661726961626c655f6c6e0100137661726961626c655f6469736369704e616d650100147661726961626c655f726174654d6561737572650100237661726961626c655f726174654d6561737572655f6469736369704e616d655f414c4c01001b7661726961626c655f726174654d6561737572655f6c6e5f414c4c0100267661726961626c655f726174654d6561737572655f6c6e5f6469736369704e616d655f414c4c0100063c696e69743e010003282956010004436f64650c001800190a0004001b0c00050006090002001d0c00070006090002001f0c0008000609000200210c0009000609000200230c000a000609000200250c000b000609000200270c000c000609000200290c000d0006090002002b0c000e0006090002002d0c000f0010090002002f0c0011001009000200310c0012001009000200330c0013001009000200350c0014001009000200370c0015001009000200390c00160010090002003b0c00170010090002003d01000f4c696e654e756d6265725461626c6501000e637573746f6d697a6564496e6974010030284c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b295601000a696e6974506172616d73010012284c6a6176612f7574696c2f4d61703b29560c004200430a00020044010008696e6974566172730c004600430a0002004701000d5245504f52545f4c4f43414c4508004901000d6a6176612f7574696c2f4d617007004b010003676574010026284c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f4f626a6563743b0c004d004e0b004c004f0100306e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d657465720700510100155245504f52545f464f524d41545f464143544f52590800530100105245504f52545f54494d455f5a4f4e450800550100145245504f52545f46494c455f5245534f4c5645520800570100155245504f52545f504152414d45544552535f4d415008005901000e5245504f52545f434f4e5445585408005b0100135245504f52545f434c4153535f4c4f4144455208005d01001a5245504f52545f55524c5f48414e444c45525f464143544f525908005f0100165245504f52545f5245534f555243455f42554e444c45080061010009524f575f434f554e5408006301002f6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c6507006501000c434f4c554d4e5f434f554e540800670100026c6e08006901000a6469736369704e616d6508006b01000b726174654d65617375726508006d01001a726174654d6561737572655f6469736369704e616d655f414c4c08006f010012726174654d6561737572655f6c6e5f414c4c08007101001d726174654d6561737572655f6c6e5f6469736369704e616d655f414c4c0800730100086576616c756174650100152849294c6a6176612f6c616e672f4f626a6563743b01000a457863657074696f6e730100136a6176612f6c616e672f5468726f7761626c6507007801000867657456616c756501001428294c6a6176612f6c616e672f4f626a6563743b0c007a007b0a0066007c0100106a6176612f6c616e672f537472696e6707007e0100116a6176612f6c616e672f496e7465676572070080010008696e7456616c75650100032829490c008200830a008100840100012d08008601000b6576616c756174654f6c640100116576616c75617465457374696d6174656401000a536f7572636546696c650021000200040000001100020005000600000002000700060000000200080006000000020009000600000002000a000600000002000b000600000002000c000600000002000d000600000002000e000600000002000f00100000000200110010000000020012001000000002001300100000000200140010000000020015001000000002001600100000000200170010000000070001001800190001001a000000ba000200010000005a2ab7001c2a01b5001e2a01b500202a01b500222a01b500242a01b500262a01b500282a01b5002a2a01b5002c2a01b5002e2a01b500302a01b500322a01b500342a01b500362a01b500382a01b5003a2a01b5003c2a01b5003eb100000001003f0000004e001300000012000400190009001a000e001b0013001c0018001d001d001e0022001f00270020002c00210031002200360023003b00240040002500450026004a0027004f002800540029005900120001004000410001001a0000002b000200040000000b2a2bb700452a2db70048b100000001003f0000000e00030000003500050036000a00370002004200430001001a000000df00030002000000a32a2b124ab900500200c00052c00052b5001e2a2b1254b900500200c00052c00052b500202a2b1256b900500200c00052c00052b500222a2b1258b900500200c00052c00052b500242a2b125ab900500200c00052c00052b500262a2b125cb900500200c00052c00052b500282a2b125eb900500200c00052c00052b5002a2a2b1260b900500200c00052c00052b5002c2a2b1262b900500200c00052c00052b5002eb100000001003f0000002a000a0000003f00120040002400410036004200480043005a0044006c0045007e00460090004700a200480002004600430001001a000000c900030002000000912a2b1264b900500200c00066c00066b500302a2b1268b900500200c00066c00066b500322a2b126ab900500200c00066c00066b500342a2b126cb900500200c00066c00066b500362a2b126eb900500200c00066c00066b500382a2b1270b900500200c00066c00066b5003a2a2b1272b900500200c00066c00066b5003c2a2b1274b900500200c00066c00066b5003eb100000001003f0000002600090000005000120051002400520036005300480054005a0055006c0056007e005700900058000100750076000200770000000400010079001a0000009b0001000300000067014d1baa0000006200000000000000020000001900000027000000352ab40034b6007dc0007f4da7003e2ab40036b6007dc0007f4da700302ab40038b6007dc00081c600132ab40038b6007dc00081b600859c00081287a7000d2ab40038b6007dc000814d2cb000000001003f0000002200080000006000020062001c006600270067002a006b0035006c0038007000650078000100880076000200770000000400010079001a0000001a000100020000000201b000000001003f00000006000100000081000100890076000200770000000400010079001a0000001a000100020000000201b000000001003f0000000600010000008a0001008a000000020001787371007e03ce3f4000000000000c7708000000100000000271007e01387571007e045b000011f7cafebabe0000002e00bf01003063686573735769746849576f7264735f6c697374446174617365745f313433343339343038353733385f37303734333207000101002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a524576616c7561746f72070003010017706172616d657465725f5245504f52545f4c4f43414c450100324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d657465723b010017706172616d657465725f4a41535045525f5245504f525401001a706172616d657465725f5245504f52545f54494d455f5a4f4e45010015706172616d657465725f534f52545f4649454c445301001e706172616d657465725f5245504f52545f46494c455f5245534f4c56455201001a706172616d657465725f5245504f52545f5343524950544c455401001f706172616d657465725f5245504f52545f504152414d45544552535f4d415001001b706172616d657465725f5245504f52545f434f4e4e454354494f4e010018706172616d657465725f5245504f52545f434f4e5445585401001d706172616d657465725f5245504f52545f434c4153535f4c4f41444552010024706172616d657465725f5245504f52545f55524c5f48414e444c45525f464143544f525901001c706172616d657465725f5245504f52545f444154415f534f55524345010010706172616d657465725f46494c544552010011706172616d657465725f67726f75704964010020706172616d657465725f4a41535045525f5245504f5254535f434f4e5445585401001f706172616d657465725f5245504f52545f464f524d41545f464143544f525901001a706172616d657465725f5245504f52545f4d41585f434f554e5401000f706172616d657465725f73656d496401001a706172616d657465725f5245504f52545f54454d504c41544553010020706172616d657465725f5245504f52545f5245534f555243455f42554e444c450100116669656c645f5375626a6563744e616d6501002e4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c643b0100126669656c645f4469736369706c696e65494401000e6669656c645f4578616d547970650100147661726961626c655f504147455f4e554d4245520100314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c653b0100167661726961626c655f434f4c554d4e5f4e554d4245520100157661726961626c655f5245504f52545f434f554e540100137661726961626c655f504147455f434f554e540100157661726961626c655f434f4c554d4e5f434f554e540100063c696e69743e010003282956010004436f64650c002400250a000400270c0005000609000200290c00070006090002002b0c00080006090002002d0c00090006090002002f0c000a000609000200310c000b000609000200330c000c000609000200350c000d000609000200370c000e000609000200390c000f0006090002003b0c00100006090002003d0c00110006090002003f0c0012000609000200410c0013000609000200430c0014000609000200450c0015000609000200470c0016000609000200490c00170006090002004b0c00180006090002004d0c00190006090002004f0c001a001b09000200510c001c001b09000200530c001d001b09000200550c001e001f09000200570c0020001f09000200590c0021001f090002005b0c0022001f090002005d0c0023001f090002005f01000f4c696e654e756d6265725461626c6501000e637573746f6d697a6564496e6974010030284c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b295601000a696e6974506172616d73010012284c6a6176612f7574696c2f4d61703b29560c006400650a0002006601000a696e69744669656c64730c006800650a00020069010008696e6974566172730c006b00650a0002006c01000d5245504f52545f4c4f43414c4508006e01000d6a6176612f7574696c2f4d6170070070010003676574010026284c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f4f626a6563743b0c007200730b007100740100306e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d6574657207007601000d4a41535045525f5245504f52540800780100105245504f52545f54494d455f5a4f4e4508007a01000b534f52545f4649454c445308007c0100145245504f52545f46494c455f5245534f4c56455208007e0100105245504f52545f5343524950544c45540800800100155245504f52545f504152414d45544552535f4d41500800820100115245504f52545f434f4e4e454354494f4e08008401000e5245504f52545f434f4e544558540800860100135245504f52545f434c4153535f4c4f4144455208008801001a5245504f52545f55524c5f48414e444c45525f464143544f525908008a0100125245504f52545f444154415f534f5552434508008c01000646494c54455208008e01000767726f757049640800900100164a41535045525f5245504f5254535f434f4e544558540800920100155245504f52545f464f524d41545f464143544f52590800940100105245504f52545f4d41585f434f554e5408009601000573656d49640800980100105245504f52545f54454d504c4154455308009a0100165245504f52545f5245534f555243455f42554e444c4508009c01000b5375626a6563744e616d6508009e01002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c640700a001000c4469736369706c696e6549440800a20100084578616d547970650800a401000b504147455f4e554d4245520800a601002f6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c650700a801000d434f4c554d4e5f4e554d4245520800aa01000c5245504f52545f434f554e540800ac01000a504147455f434f554e540800ae01000c434f4c554d4e5f434f554e540800b00100086576616c756174650100152849294c6a6176612f6c616e672f4f626a6563743b01000a457863657074696f6e730100136a6176612f6c616e672f5468726f7761626c650700b50100116a6176612f6c616e672f496e74656765720700b7010004284929560c002400b90a00b800ba01000b6576616c756174654f6c640100116576616c75617465457374696d6174656401000a536f7572636546696c650021000200040000001c00020005000600000002000700060000000200080006000000020009000600000002000a000600000002000b000600000002000c000600000002000d000600000002000e000600000002000f0006000000020010000600000002001100060000000200120006000000020013000600000002001400060000000200150006000000020016000600000002001700060000000200180006000000020019000600000002001a001b00000002001c001b00000002001d001b00000002001e001f000000020020001f000000020021001f000000020022001f000000020023001f00000008000100240025000100260000011d00020001000000912ab700282a01b5002a2a01b5002c2a01b5002e2a01b500302a01b500322a01b500342a01b500362a01b500382a01b5003a2a01b5003c2a01b5003e2a01b500402a01b500422a01b500442a01b500462a01b500482a01b5004a2a01b5004c2a01b5004e2a01b500502a01b500522a01b500542a01b500562a01b500582a01b5005a2a01b5005c2a01b5005e2a01b50060b10000000100610000007a001e00000012000400190009001a000e001b0013001c0018001d001d001e0022001f00270020002c00210031002200360023003b00240040002500450026004a0027004f0028005400290059002a005e002b0063002c0068002d006d002e0072002f00770030007c00310081003200860033008b003400900012000100620063000100260000003400020004000000102a2bb700672a2cb7006a2a2db7006db10000000100610000001200040000004000050041000a0042000f004300020064006500010026000001d100030002000001692a2b126fb900750200c00077c00077b5002a2a2b1279b900750200c00077c00077b5002c2a2b127bb900750200c00077c00077b5002e2a2b127db900750200c00077c00077b500302a2b127fb900750200c00077c00077b500322a2b1281b900750200c00077c00077b500342a2b1283b900750200c00077c00077b500362a2b1285b900750200c00077c00077b500382a2b1287b900750200c00077c00077b5003a2a2b1289b900750200c00077c00077b5003c2a2b128bb900750200c00077c00077b5003e2a2b128db900750200c00077c00077b500402a2b128fb900750200c00077c00077b500422a2b1291b900750200c00077c00077b500442a2b1293b900750200c00077c00077b500462a2b1295b900750200c00077c00077b500482a2b1297b900750200c00077c00077b5004a2a2b1299b900750200c00077c00077b5004c2a2b129bb900750200c00077c00077b5004e2a2b129db900750200c00077c00077b50050b10000000100610000005600150000004b0012004c0024004d0036004e0048004f005a0050006c0051007e00520090005300a2005400b4005500c6005600d8005700ea005800fc0059010e005a0120005b0132005c0144005d0156005e0168005f000200680065000100260000005b00030002000000372a2b129fb900750200c000a1c000a1b500522a2b12a3b900750200c000a1c000a1b500542a2b12a5b900750200c000a1c000a1b50056b10000000100610000001200040000006700120068002400690036006a0002006b00650001002600000087000300020000005b2a2b12a7b900750200c000a9c000a9b500582a2b12abb900750200c000a9c000a9b5005a2a2b12adb900750200c000a9c000a9b5005c2a2b12afb900750200c000a9c000a9b5005e2a2b12b1b900750200c000a9c000a9b50060b10000000100610000001a00060000007200120073002400740036007500480076005a0077000100b200b3000200b400000004000100b60026000000eb000300030000008f014d1baa0000008a00000000000000070000002d0000003900000045000000510000005d000000690000007500000081bb00b85904b700bb4da70054bb00b85904b700bb4da70048bb00b85904b700bb4da7003cbb00b85903b700bb4da70030bb00b85904b700bb4da70024bb00b85903b700bb4da70018bb00b85904b700bb4da7000cbb00b85903b700bb4d2cb00000000100610000004a00120000007f000200810030008500390086003c008a0045008b0048008f0051009000540094005d0095006000990069009a006c009e0075009f007800a3008100a4008400a8008d00b0000100bc00b3000200b400000004000100b60026000000eb000300030000008f014d1baa0000008a00000000000000070000002d0000003900000045000000510000005d000000690000007500000081bb00b85904b700bb4da70054bb00b85904b700bb4da70048bb00b85904b700bb4da7003cbb00b85903b700bb4da70030bb00b85904b700bb4da70024bb00b85903b700bb4da70018bb00b85904b700bb4da7000cbb00b85903b700bb4d2cb00000000100610000004a0012000000b9000200bb003000bf003900c0003c00c4004500c5004800c9005100ca005400ce005d00cf006000d3006900d4006c00d8007500d9007800dd008100de008400e2008d00ea000100bd00b3000200b400000004000100b60026000000eb000300030000008f014d1baa0000008a00000000000000070000002d0000003900000045000000510000005d000000690000007500000081bb00b85904b700bb4da70054bb00b85904b700bb4da70048bb00b85904b700bb4da7003cbb00b85903b700bb4da70030bb00b85904b700bb4da70024bb00b85903b700bb4da70018bb00b85904b700bb4da7000cbb00b85903b700bb4d2cb00000000100610000004a0012000000f3000200f5003000f9003900fa003c00fe004500ff004801030051010400540108005d01090060010d0069010e006c01120075011300780117008101180084011c008d0124000100be00000002000171007e005a7571007e045b00001899cafebabe0000002e010001003463686573735769746849576f7264735f63726f7373746162446174617365745f313433343339343038353733385f37303734333207000101002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a524576616c7561746f72070003010017706172616d657465725f5245504f52545f4c4f43414c450100324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d657465723b010017706172616d657465725f4a41535045525f5245504f525401001a706172616d657465725f5245504f52545f54494d455f5a4f4e45010015706172616d657465725f534f52545f4649454c445301001e706172616d657465725f5245504f52545f46494c455f5245534f4c56455201001a706172616d657465725f5245504f52545f5343524950544c455401001f706172616d657465725f5245504f52545f504152414d45544552535f4d415001001b706172616d657465725f5245504f52545f434f4e4e454354494f4e010018706172616d657465725f5245504f52545f434f4e5445585401001d706172616d657465725f5245504f52545f434c4153535f4c4f41444552010024706172616d657465725f5245504f52545f55524c5f48414e444c45525f464143544f525901001c706172616d657465725f5245504f52545f444154415f534f55524345010010706172616d657465725f46494c544552010011706172616d657465725f67726f75704964010020706172616d657465725f4a41535045525f5245504f5254535f434f4e5445585401001f706172616d657465725f5245504f52545f464f524d41545f464143544f525901001a706172616d657465725f5245504f52545f4d41585f434f554e5401000f706172616d657465725f73656d496401001a706172616d657465725f5245504f52545f54454d504c41544553010020706172616d657465725f5245504f52545f5245534f555243455f42554e444c4501000d6669656c645f5375627479706501002e4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c643b0100116669656c645f5375626a656374416262720100116669656c645f5375626a6563744e616d650100116669656c645f72617465526567756c617201000e6669656c645f4578616d5479706501000f6669656c645f46697273744e616d6501000e6669656c645f4c6173744e616d650100106669656c645f5365636f6e644e616d650100147661726961626c655f504147455f4e554d4245520100314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c653b0100167661726961626c655f434f4c554d4e5f4e554d4245520100157661726961626c655f5245504f52545f434f554e540100137661726961626c655f504147455f434f554e540100157661726961626c655f434f4c554d4e5f434f554e540100063c696e69743e010003282956010004436f64650c0029002a0a0004002c0c00050006090002002e0c0007000609000200300c0008000609000200320c0009000609000200340c000a000609000200360c000b000609000200380c000c0006090002003a0c000d0006090002003c0c000e0006090002003e0c000f000609000200400c0010000609000200420c0011000609000200440c0012000609000200460c0013000609000200480c00140006090002004a0c00150006090002004c0c00160006090002004e0c0017000609000200500c0018000609000200520c0019000609000200540c001a001b09000200560c001c001b09000200580c001d001b090002005a0c001e001b090002005c0c001f001b090002005e0c0020001b09000200600c0021001b09000200620c0022001b09000200640c0023002409000200660c0025002409000200680c00260024090002006a0c00270024090002006c0c00280024090002006e01000f4c696e654e756d6265725461626c6501000e637573746f6d697a6564496e6974010030284c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b295601000a696e6974506172616d73010012284c6a6176612f7574696c2f4d61703b29560c007300740a0002007501000a696e69744669656c64730c007700740a00020078010008696e6974566172730c007a00740a0002007b01000d5245504f52545f4c4f43414c4508007d01000d6a6176612f7574696c2f4d617007007f010003676574010026284c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f4f626a6563743b0c008100820b008000830100306e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d6574657207008501000d4a41535045525f5245504f52540800870100105245504f52545f54494d455f5a4f4e4508008901000b534f52545f4649454c445308008b0100145245504f52545f46494c455f5245534f4c56455208008d0100105245504f52545f5343524950544c455408008f0100155245504f52545f504152414d45544552535f4d41500800910100115245504f52545f434f4e4e454354494f4e08009301000e5245504f52545f434f4e544558540800950100135245504f52545f434c4153535f4c4f4144455208009701001a5245504f52545f55524c5f48414e444c45525f464143544f52590800990100125245504f52545f444154415f534f5552434508009b01000646494c54455208009d01000767726f7570496408009f0100164a41535045525f5245504f5254535f434f4e544558540800a10100155245504f52545f464f524d41545f464143544f52590800a30100105245504f52545f4d41585f434f554e540800a501000573656d49640800a70100105245504f52545f54454d504c415445530800a90100165245504f52545f5245534f555243455f42554e444c450800ab010007537562747970650800ad01002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c640700af01000b5375626a656374416262720800b101000b5375626a6563744e616d650800b301000b72617465526567756c61720800b50100084578616d547970650800b701000946697273744e616d650800b90100084c6173744e616d650800bb01000a5365636f6e644e616d650800bd01000b504147455f4e554d4245520800bf01002f6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c650700c101000d434f4c554d4e5f4e554d4245520800c301000c5245504f52545f434f554e540800c501000a504147455f434f554e540800c701000c434f4c554d4e5f434f554e540800c90100086576616c756174650100152849294c6a6176612f6c616e672f4f626a6563743b01000a457863657074696f6e730100136a6176612f6c616e672f5468726f7761626c650700ce0100116a6176612f6c616e672f496e74656765720700d0010004284929560c002900d20a00d100d30100166a6176612f6c616e672f537472696e674275666665720700d501000867657456616c756501001428294c6a6176612f6c616e672f4f626a6563743b0c00d700d80a00b000d90100106a6176612f6c616e672f537472696e670700db01000776616c75654f66010026284c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f537472696e673b0c00dd00de0a00dc00df010015284c6a6176612f6c616e672f537472696e673b29560c002900e10a00d600e2010001200800e4010006617070656e6401002c284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f537472696e674275666665723b0c00e600e70a00d600e80100076973456d70747901000328295a0c00ea00eb0a00dc00ec0100000800ee010009737562737472696e67010016284949294c6a6176612f6c616e672f537472696e673b0c00f000f10a00dc00f20100012e0800f4010008746f537472696e6701001428294c6a6176612f6c616e672f537472696e673b0c00f600f70a00d600f801000b6576616c756174654f6c6401000b6765744f6c6456616c75650c00fb00d80a00b000fc0100116576616c75617465457374696d6174656401000a536f7572636546696c650021000200040000002100020005000600000002000700060000000200080006000000020009000600000002000a000600000002000b000600000002000c000600000002000d000600000002000e000600000002000f0006000000020010000600000002001100060000000200120006000000020013000600000002001400060000000200150006000000020016000600000002001700060000000200180006000000020019000600000002001a001b00000002001c001b00000002001d001b00000002001e001b00000002001f001b000000020020001b000000020021001b000000020022001b000000020023002400000002002500240000000200260024000000020027002400000002002800240000000800010029002a0001002b0000014a00020001000000aa2ab7002d2a01b5002f2a01b500312a01b500332a01b500352a01b500372a01b500392a01b5003b2a01b5003d2a01b5003f2a01b500412a01b500432a01b500452a01b500472a01b500492a01b5004b2a01b5004d2a01b5004f2a01b500512a01b500532a01b500552a01b500572a01b500592a01b5005b2a01b5005d2a01b5005f2a01b500612a01b500632a01b500652a01b500672a01b500692a01b5006b2a01b5006d2a01b5006fb10000000100700000008e002300000012000400190009001a000e001b0013001c0018001d001d001e0022001f00270020002c00210031002200360023003b00240040002500450026004a0027004f0028005400290059002a005e002b0063002c0068002d006d002e0072002f00770030007c00310081003200860033008b00340090003500950036009a0037009f003800a4003900a900120001007100720001002b0000003400020004000000102a2bb700762a2cb700792a2db7007cb10000000100700000001200040000004500050046000a0047000f00480002007300740001002b000001d100030002000001692a2b127eb900840200c00086c00086b5002f2a2b1288b900840200c00086c00086b500312a2b128ab900840200c00086c00086b500332a2b128cb900840200c00086c00086b500352a2b128eb900840200c00086c00086b500372a2b1290b900840200c00086c00086b500392a2b1292b900840200c00086c00086b5003b2a2b1294b900840200c00086c00086b5003d2a2b1296b900840200c00086c00086b5003f2a2b1298b900840200c00086c00086b500412a2b129ab900840200c00086c00086b500432a2b129cb900840200c00086c00086b500452a2b129eb900840200c00086c00086b500472a2b12a0b900840200c00086c00086b500492a2b12a2b900840200c00086c00086b5004b2a2b12a4b900840200c00086c00086b5004d2a2b12a6b900840200c00086c00086b5004f2a2b12a8b900840200c00086c00086b500512a2b12aab900840200c00086c00086b500532a2b12acb900840200c00086c00086b50055b10000000100700000005600150000005000120051002400520036005300480054005a0055006c0056007e00570090005800a2005900b4005a00c6005b00d8005c00ea005d00fc005e010e005f01200060013200610144006201560063016800640002007700740001002b000000c900030002000000912a2b12aeb900840200c000b0c000b0b500572a2b12b2b900840200c000b0c000b0b500592a2b12b4b900840200c000b0c000b0b5005b2a2b12b6b900840200c000b0c000b0b5005d2a2b12b8b900840200c000b0c000b0b5005f2a2b12bab900840200c000b0c000b0b500612a2b12bcb900840200c000b0c000b0b500632a2b12beb900840200c000b0c000b0b50065b10000000100700000002600090000006c0012006d0024006e0036006f00480070005a0071006c0072007e0073009000740002007a00740001002b00000087000300020000005b2a2b12c0b900840200c000c2c000c2b500672a2b12c4b900840200c000c2c000c2b500692a2b12c6b900840200c000c2c000c2b5006b2a2b12c8b900840200c000c2c000c2b5006d2a2b12cab900840200c000c2c000c2b5006fb10000000100700000001a00060000007c0012007d0024007e0036007f00480080005a0081000100cb00cc000200cd00000004000100cf002b0000020d000600030000018d014d1baa00000188000000000000000a0000003900000045000000510000005d0000006900000075000000810000008d00000099000001450000017dbb00d15904b700d44da70146bb00d15904b700d44da7013abb00d15904b700d44da7012ebb00d15903b700d44da70122bb00d15904b700d44da70116bb00d15903b700d44da7010abb00d15904b700d44da700febb00d15903b700d44da700f2bb00d6592ab40063b600dac000dcb800e0b700e312e5b600e92ab40061b600dac000dcc600132ab40061b600dac000dcb600ed99000812efa70024bb00d6592ab40061b600dac000dc0304b600f3b800e0b700e312f5b600e9b600f9b600e92ab40065b600dac000dcc600132ab40065b600dac000dcb600ed99000812efa70024bb00d6592ab40065b600dac000dc0304b600f3b800e0b700e312f5b600e9b600f9b600e9b600f94da700462ab40059b600dac000dcc600132ab40059b600dac000dcb600ed9900102ab4005bb600dac000dca7000d2ab40059b600dac000dc4da7000e2ab4005db600dac000d14d2cb00000000100700000006e001b000000890002008b003c008f00450090004800940051009500540099005d009a0060009e0069009f006c00a3007500a4007800a8008100a9008400ad008d00ae009000b2009900b3009c00b700b500b800fb00b9014100b7014500ba014800be017d00bf018000c3018b00cb000100fa00cc000200cd00000004000100cf002b0000020d000600030000018d014d1baa00000188000000000000000a0000003900000045000000510000005d0000006900000075000000810000008d00000099000001450000017dbb00d15904b700d44da70146bb00d15904b700d44da7013abb00d15904b700d44da7012ebb00d15903b700d44da70122bb00d15904b700d44da70116bb00d15903b700d44da7010abb00d15904b700d44da700febb00d15903b700d44da700f2bb00d6592ab40063b600fdc000dcb800e0b700e312e5b600e92ab40061b600fdc000dcc600132ab40061b600fdc000dcb600ed99000812efa70024bb00d6592ab40061b600fdc000dc0304b600f3b800e0b700e312f5b600e9b600f9b600e92ab40065b600fdc000dcc600132ab40065b600fdc000dcb600ed99000812efa70024bb00d6592ab40065b600fdc000dc0304b600f3b800e0b700e312f5b600e9b600f9b600e9b600f94da700462ab40059b600fdc000dcc600132ab40059b600fdc000dcb600ed9900102ab4005bb600fdc000dca7000d2ab40059b600fdc000dc4da7000e2ab4005db600fdc000d14d2cb00000000100700000006e001b000000d4000200d6003c00da004500db004800df005100e0005400e4005d00e5006000e9006900ea006c00ee007500ef007800f3008100f4008400f8008d00f9009000fd009900fe009c010200b5010300fb0104014101020145010501480109017d010a0180010e018b0116000100fe00cc000200cd00000004000100cf002b0000020d000600030000018d014d1baa00000188000000000000000a0000003900000045000000510000005d0000006900000075000000810000008d00000099000001450000017dbb00d15904b700d44da70146bb00d15904b700d44da7013abb00d15904b700d44da7012ebb00d15903b700d44da70122bb00d15904b700d44da70116bb00d15903b700d44da7010abb00d15904b700d44da700febb00d15903b700d44da700f2bb00d6592ab40063b600dac000dcb800e0b700e312e5b600e92ab40061b600dac000dcc600132ab40061b600dac000dcb600ed99000812efa70024bb00d6592ab40061b600dac000dc0304b600f3b800e0b700e312f5b600e9b600f9b600e92ab40065b600dac000dcc600132ab40065b600dac000dcb600ed99000812efa70024bb00d6592ab40065b600dac000dc0304b600f3b800e0b700e312f5b600e9b600f9b600e9b600f94da700462ab40059b600dac000dcc600132ab40059b600dac000dcb600ed9900102ab4005bb600dac000dca7000d2ab40059b600dac000dc4da7000e2ab4005db600dac000d14d2cb00000000100700000006e001b0000011f00020121003c0125004501260048012a0051012b0054012f005d01300060013400690135006c01390075013a0078013e0081013f00840143008d01440090014800990149009c014d00b5014e00fb014f0141014d0145015001480154017d015501800159018b0161000100ff000000020001787571007e045b000019b6cafebabe0000002e010b01002463686573735769746849576f7264735f313433343339343038353733385f37303734333207000101002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a524576616c7561746f72070003010017706172616d657465725f4a41535045525f5245504f52540100324c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d657465723b01001a706172616d657465725f5245504f52545f54494d455f5a4f4e45010011706172616d657465725f73656d5965617201001e706172616d657465725f5245504f52545f46494c455f5245534f4c56455201001f706172616d657465725f5245504f52545f504152414d45544552535f4d4150010012706172616d657465725f67726f75704e756d010018706172616d657465725f5245504f52545f434f4e5445585401001d706172616d657465725f5245504f52545f434c4153535f4c4f4144455201001c706172616d657465725f5245504f52545f444154415f534f55524345010024706172616d657465725f5245504f52545f55524c5f48414e444c45525f464143544f525901001e706172616d657465725f49535f49474e4f52455f504147494e4154494f4e01001a706172616d657465725f5245504f52545f4d41585f434f554e5401001a706172616d657465725f5245504f52545f54454d504c41544553010017706172616d657465725f5245504f52545f4c4f43414c4501001c706172616d657465725f5245504f52545f5649525455414c495a4552010015706172616d657465725f534f52545f4649454c445301001a706172616d657465725f5245504f52545f5343524950544c4554010010706172616d657465725f73656d4e756d01001b706172616d657465725f5245504f52545f434f4e4e454354494f4e010010706172616d657465725f46494c544552010020706172616d657465725f4a41535045525f5245504f5254535f434f4e5445585401001f706172616d657465725f5245504f52545f464f524d41545f464143544f5259010010706172616d657465725f646567726565010013706172616d657465725f636f757273654e756d010020706172616d657465725f5245504f52545f5245534f555243455f42554e444c45010012706172616d657465725f73656d657374657201000d6669656c645f67726f7570496401002e4c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c643b01000b6669656c645f73656d496401000e6669656c645f737065634e616d6501000d6669656c645f6661634e616d650100147661726961626c655f504147455f4e554d4245520100314c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c653b0100167661726961626c655f434f4c554d4e5f4e554d4245520100157661726961626c655f5245504f52545f434f554e540100137661726961626c655f504147455f434f554e540100157661726961626c655f434f4c554d4e5f434f554e540100063c696e69743e010003282956010004436f64650c002b002c0a0004002e0c0005000609000200300c0007000609000200320c0008000609000200340c0009000609000200360c000a000609000200380c000b0006090002003a0c000c0006090002003c0c000d0006090002003e0c000e000609000200400c000f000609000200420c0010000609000200440c0011000609000200460c0012000609000200480c00130006090002004a0c00140006090002004c0c00150006090002004e0c0016000609000200500c0017000609000200520c0018000609000200540c0019000609000200560c001a000609000200580c001b0006090002005a0c001c0006090002005c0c001d0006090002005e0c001e000609000200600c001f000609000200620c0020002109000200640c0022002109000200660c0023002109000200680c00240021090002006a0c00250026090002006c0c00270026090002006e0c0028002609000200700c0029002609000200720c002a0026090002007401000f4c696e654e756d6265725461626c6501000e637573746f6d697a6564496e6974010030284c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b4c6a6176612f7574696c2f4d61703b295601000a696e6974506172616d73010012284c6a6176612f7574696c2f4d61703b29560c0079007a0a0002007b01000a696e69744669656c64730c007d007a0a0002007e010008696e6974566172730c0080007a0a0002008101000d4a41535045525f5245504f525408008301000d6a6176612f7574696c2f4d6170070085010003676574010026284c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f4f626a6563743b0c008700880b008600890100306e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c506172616d6574657207008b0100105245504f52545f54494d455f5a4f4e4508008d01000773656d5965617208008f0100145245504f52545f46494c455f5245534f4c5645520800910100155245504f52545f504152414d45544552535f4d415008009301000867726f75704e756d08009501000e5245504f52545f434f4e544558540800970100135245504f52545f434c4153535f4c4f414445520800990100125245504f52545f444154415f534f5552434508009b01001a5245504f52545f55524c5f48414e444c45525f464143544f525908009d01001449535f49474e4f52455f504147494e4154494f4e08009f0100105245504f52545f4d41585f434f554e540800a10100105245504f52545f54454d504c415445530800a301000d5245504f52545f4c4f43414c450800a50100125245504f52545f5649525455414c495a45520800a701000b534f52545f4649454c44530800a90100105245504f52545f5343524950544c45540800ab01000673656d4e756d0800ad0100115245504f52545f434f4e4e454354494f4e0800af01000646494c5445520800b10100164a41535045525f5245504f5254535f434f4e544558540800b30100155245504f52545f464f524d41545f464143544f52590800b50100066465677265650800b7010009636f757273654e756d0800b90100165245504f52545f5245534f555243455f42554e444c450800bb01000873656d65737465720800bd01000767726f757049640800bf01002c6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c4669656c640700c101000573656d49640800c3010008737065634e616d650800c50100076661634e616d650800c701000b504147455f4e554d4245520800c901002f6e65742f73662f6a61737065727265706f7274732f656e67696e652f66696c6c2f4a5246696c6c5661726961626c650700cb01000d434f4c554d4e5f4e554d4245520800cd01000c5245504f52545f434f554e540800cf01000a504147455f434f554e540800d101000c434f4c554d4e5f434f554e540800d30100086576616c756174650100152849294c6a6176612f6c616e672f4f626a6563743b01000a457863657074696f6e730100136a6176612f6c616e672f5468726f7761626c650700d801000867657456616c756501001428294c6a6176612f6c616e672f4f626a6563743b0c00da00db0a008c00dc0100106a6176612f6c616e672f537472696e670700de0100022c200800e001000573706c6974010027284c6a6176612f6c616e672f537472696e673b295b4c6a6176612f6c616e672f537472696e673b0c00e200e30a00df00e40100116a6176612f6c616e672f496e74656765720700e6010004284929560c002b00e80a00e700e90100166a6176612f6c616e672f537472696e674275666665720700eb010009d09ad183d180d181200800ed010015284c6a6176612f6c616e672f537472696e673b29560c002b00ef0a00ec00f0010006617070656e6401002c284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f537472696e674275666665723b0c00f200f30a00ec00f401000f2c20d0b3d180d183d0bfd0bfd0b0200800f60100112c20d181d0b5d0bcd0b5d181d182d180200800f8010008746f537472696e6701001428294c6a6176612f6c616e672f537472696e673b0c00fa00fb0a00ec00fc01001cd0a1d0bfd0b5d186d0b8d0b0d0bbd18cd0bdd0bed181d182d18c3a200800fe0a00c200dc010014d0a4d0b0d0bad183d0bbd18cd182d0b5d1823a200801010100136a6176612f73716c2f436f6e6e656374696f6e07010301000b6576616c756174654f6c6401000b6765744f6c6456616c75650c010600db0a00c201070100116576616c75617465457374696d6174656401000a536f7572636546696c650021000200040000002300020005000600000002000700060000000200080006000000020009000600000002000a000600000002000b000600000002000c000600000002000d000600000002000e000600000002000f0006000000020010000600000002001100060000000200120006000000020013000600000002001400060000000200150006000000020016000600000002001700060000000200180006000000020019000600000002001a000600000002001b000600000002001c000600000002001d000600000002001e000600000002001f00060000000200200021000000020022002100000002002300210000000200240021000000020025002600000002002700260000000200280026000000020029002600000002002a0026000000080001002b002c0001002d0000015c00020001000000b42ab7002f2a01b500312a01b500332a01b500352a01b500372a01b500392a01b5003b2a01b5003d2a01b5003f2a01b500412a01b500432a01b500452a01b500472a01b500492a01b5004b2a01b5004d2a01b5004f2a01b500512a01b500532a01b500552a01b500572a01b500592a01b5005b2a01b5005d2a01b5005f2a01b500612a01b500632a01b500652a01b500672a01b500692a01b5006b2a01b5006d2a01b5006f2a01b500712a01b500732a01b50075b100000001007600000096002500000012000400190009001a000e001b0013001c0018001d001d001e0022001f00270020002c00210031002200360023003b00240040002500450026004a0027004f0028005400290059002a005e002b0063002c0068002d006d002e0072002f00770030007c00310081003200860033008b00340090003500950036009a0037009f003800a4003900a9003a00ae003b00b300120001007700780001002d0000003400020004000000102a2bb7007c2a2cb7007f2a2db70082b10000000100760000001200040000004700050048000a0049000f004a00020079007a0001002d0000025500030002000001d52a2b1284b9008a0200c0008cc0008cb500312a2b128eb9008a0200c0008cc0008cb500332a2b1290b9008a0200c0008cc0008cb500352a2b1292b9008a0200c0008cc0008cb500372a2b1294b9008a0200c0008cc0008cb500392a2b1296b9008a0200c0008cc0008cb5003b2a2b1298b9008a0200c0008cc0008cb5003d2a2b129ab9008a0200c0008cc0008cb5003f2a2b129cb9008a0200c0008cc0008cb500412a2b129eb9008a0200c0008cc0008cb500432a2b12a0b9008a0200c0008cc0008cb500452a2b12a2b9008a0200c0008cc0008cb500472a2b12a4b9008a0200c0008cc0008cb500492a2b12a6b9008a0200c0008cc0008cb5004b2a2b12a8b9008a0200c0008cc0008cb5004d2a2b12aab9008a0200c0008cc0008cb5004f2a2b12acb9008a0200c0008cc0008cb500512a2b12aeb9008a0200c0008cc0008cb500532a2b12b0b9008a0200c0008cc0008cb500552a2b12b2b9008a0200c0008cc0008cb500572a2b12b4b9008a0200c0008cc0008cb500592a2b12b6b9008a0200c0008cc0008cb5005b2a2b12b8b9008a0200c0008cc0008cb5005d2a2b12bab9008a0200c0008cc0008cb5005f2a2b12bcb9008a0200c0008cc0008cb500612a2b12beb9008a0200c0008cc0008cb50063b10000000100760000006e001b0000005200120053002400540036005500480056005a0057006c0058007e00590090005a00a2005b00b4005c00c6005d00d8005e00ea005f00fc0060010e00610120006201320063014400640156006501680066017a0067018c0068019e006901b0006a01c2006b01d4006c0002007d007a0001002d0000007100030002000000492a2b12c0b9008a0200c000c2c000c2b500652a2b12c4b9008a0200c000c2c000c2b500672a2b12c6b9008a0200c000c2c000c2b500692a2b12c8b9008a0200c000c2c000c2b5006bb1000000010076000000160005000000740012007500240076003600770048007800020080007a0001002d00000087000300020000005b2a2b12cab9008a0200c000ccc000ccb5006d2a2b12ceb9008a0200c000ccc000ccb5006f2a2b12d0b9008a0200c000ccc000ccb500712a2b12d2b9008a0200c000ccc000ccb500732a2b12d4b9008a0200c000ccc000ccb50075b10000000100760000001a00060000008000120081002400820036008300480084005a0085000100d500d6000200d700000004000100d9002d0000021b000300030000017f014d1baa0000017a000000000000000f0000004d0000006200000077000000830000008f0000009b000000a7000000b3000000bf000000cb000000d7000001180000013500000153000001610000016f2ab40063b600ddc000df12e1b600e504324da7011b2ab40063b600ddc000df12e1b600e503324da70106bb00e75904b700ea4da700fabb00e75904b700ea4da700eebb00e75904b700ea4da700e2bb00e75903b700ea4da700d6bb00e75904b700ea4da700cabb00e75903b700ea4da700bebb00e75904b700ea4da700b2bb00e75903b700ea4da700a6bb00ec5912eeb700f12ab4005fb600ddc000dfb600f512f7b600f52ab4003bb600ddc000dfb600f512f9b600f52ab40063b600ddc000dfb600f5b600fd4da70065bb00ec5912ffb700f12ab40069b60100c000dfb600f5b600fd4da70048bb00ec59130102b700f12ab4006bb60100c000dfb600f5b600fd4da7002a2ab40055b600ddc001044da7001c2ab40065b60100c000e74da7000e2ab40067b60100c000e74d2cb00000000100760000008a00220000008d0002008f00500093006200940065009800770099007a009d0083009e008600a2008f00a3009200a7009b00a8009e00ac00a700ad00aa00b100b300b200b600b600bf00b700c200bb00cb00bc00ce00c000d700c100da00c5011800c6011b00ca013500cb013800cf015300d0015600d4016100d5016400d9016f00da017200de017d00e60001010500d6000200d700000004000100d9002d0000021b000300030000017f014d1baa0000017a000000000000000f0000004d0000006200000077000000830000008f0000009b000000a7000000b3000000bf000000cb000000d7000001180000013500000153000001610000016f2ab40063b600ddc000df12e1b600e504324da7011b2ab40063b600ddc000df12e1b600e503324da70106bb00e75904b700ea4da700fabb00e75904b700ea4da700eebb00e75904b700ea4da700e2bb00e75903b700ea4da700d6bb00e75904b700ea4da700cabb00e75903b700ea4da700bebb00e75904b700ea4da700b2bb00e75903b700ea4da700a6bb00ec5912eeb700f12ab4005fb600ddc000dfb600f512f7b600f52ab4003bb600ddc000dfb600f512f9b600f52ab40063b600ddc000dfb600f5b600fd4da70065bb00ec5912ffb700f12ab40069b60108c000dfb600f5b600fd4da70048bb00ec59130102b700f12ab4006bb60108c000dfb600f5b600fd4da7002a2ab40055b600ddc001044da7001c2ab40065b60108c000e74da7000e2ab40067b60108c000e74d2cb00000000100760000008a0022000000ef000200f1005000f5006200f6006500fa007700fb007a00ff0083010000860104008f010500920109009b010a009e010e00a7010f00aa011300b3011400b6011800bf011900c2011d00cb011e00ce012200d7012300da012701180128011b012c0135012d013801310153013201560136016101370164013b016f013c01720140017d01480001010900d6000200d700000004000100d9002d0000021b000300030000017f014d1baa0000017a000000000000000f0000004d0000006200000077000000830000008f0000009b000000a7000000b3000000bf000000cb000000d7000001180000013500000153000001610000016f2ab40063b600ddc000df12e1b600e504324da7011b2ab40063b600ddc000df12e1b600e503324da70106bb00e75904b700ea4da700fabb00e75904b700ea4da700eebb00e75904b700ea4da700e2bb00e75903b700ea4da700d6bb00e75904b700ea4da700cabb00e75903b700ea4da700bebb00e75904b700ea4da700b2bb00e75903b700ea4da700a6bb00ec5912eeb700f12ab4005fb600ddc000dfb600f512f7b600f52ab4003bb600ddc000dfb600f512f9b600f52ab40063b600ddc000dfb600f5b600fd4da70065bb00ec5912ffb700f12ab40069b60100c000dfb600f5b600fd4da70048bb00ec59130102b700f12ab4006bb60100c000dfb600f5b600fd4da7002a2ab40055b600ddc001044da7001c2ab40065b60100c000e74da7000e2ab40067b60100c000e74d2cb00000000100760000008a0022000001510002015300500157006201580065015c0077015d007a01610083016200860166008f01670092016b009b016c009e017000a7017100aa017500b3017600b6017a00bf017b00c2017f00cb018000ce018400d7018500da01890118018a011b018e0135018f013801930153019401560198016101990164019d016f019e017201a2017d01aa0001010a0000000200017400155f313433343339343038353733385f3730373433327400326e65742e73662e6a61737065727265706f7274732e656e67696e652e64657369676e2e4a524a61766163436f6d70696c6572);
+
+
+INSERT INTO `reports_params` (`reportId`, `paramId`) VALUES
+(4, 4),
+(4, 5),
+(4, 6),
+(4, 7),
+(5, 1),
+(5, 2),
+(5, 3),
+(5, 8),
+(13, 1),
+(13, 2),
+(13, 3),
+(13, 8),
+(14, 1),
+(14, 2),
+(14, 3),
+(14, 8);
\ No newline at end of file
diff --git a/doc/dev/index.html b/doc/dev/index.html
deleted file mode 100644
index 70387ac416533088e54a775f7e2c6a048adddee3..0000000000000000000000000000000000000000
--- a/doc/dev/index.html
+++ /dev/null
@@ -1,897 +0,0 @@
-<!DOCTYPE html><html><head><meta charset="utf-8"><style>body {
-  width: 45em;
-  border: 1px solid #ddd;
-  outline: 1300px solid #fff;
-  margin: 16px auto;
-}
-
-body .markdown-body
-{
-  padding: 30px;
-}
-
-@font-face {
-  font-family: octicons-anchor;
-  src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAYcAA0AAAAACjQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABMAAAABwAAAAca8vGTk9TLzIAAAFMAAAARAAAAFZG1VHVY21hcAAAAZAAAAA+AAABQgAP9AdjdnQgAAAB0AAAAAQAAAAEACICiGdhc3AAAAHUAAAACAAAAAj//wADZ2x5ZgAAAdwAAADRAAABEKyikaNoZWFkAAACsAAAAC0AAAA2AtXoA2hoZWEAAALgAAAAHAAAACQHngNFaG10eAAAAvwAAAAQAAAAEAwAACJsb2NhAAADDAAAAAoAAAAKALIAVG1heHAAAAMYAAAAHwAAACABEAB2bmFtZQAAAzgAAALBAAAFu3I9x/Nwb3N0AAAF/AAAAB0AAAAvaoFvbwAAAAEAAAAAzBdyYwAAAADP2IQvAAAAAM/bz7t4nGNgZGFgnMDAysDB1Ml0hoGBoR9CM75mMGLkYGBgYmBlZsAKAtJcUxgcPsR8iGF2+O/AEMPsznAYKMwIkgMA5REMOXicY2BgYGaAYBkGRgYQsAHyGMF8FgYFIM0ChED+h5j//yEk/3KoSgZGNgYYk4GRCUgwMaACRoZhDwCs7QgGAAAAIgKIAAAAAf//AAJ4nHWMMQrCQBBF/0zWrCCIKUQsTDCL2EXMohYGSSmorScInsRGL2DOYJe0Ntp7BK+gJ1BxF1stZvjz/v8DRghQzEc4kIgKwiAppcA9LtzKLSkdNhKFY3HF4lK69ExKslx7Xa+vPRVS43G98vG1DnkDMIBUgFN0MDXflU8tbaZOUkXUH0+U27RoRpOIyCKjbMCVejwypzJJG4jIwb43rfl6wbwanocrJm9XFYfskuVC5K/TPyczNU7b84CXcbxks1Un6H6tLH9vf2LRnn8Ax7A5WQAAAHicY2BkYGAA4teL1+yI57f5ysDNwgAC529f0kOmWRiYVgEpDgYmEA8AUzEKsQAAAHicY2BkYGB2+O/AEMPCAAJAkpEBFbAAADgKAe0EAAAiAAAAAAQAAAAEAAAAAAAAKgAqACoAiAAAeJxjYGRgYGBhsGFgYgABEMkFhAwM/xn0QAIAD6YBhwB4nI1Ty07cMBS9QwKlQapQW3VXySvEqDCZGbGaHULiIQ1FKgjWMxknMfLEke2A+IJu+wntrt/QbVf9gG75jK577Lg8K1qQPCfnnnt8fX1NRC/pmjrk/zprC+8D7tBy9DHgBXoWfQ44Av8t4Bj4Z8CLtBL9CniJluPXASf0Lm4CXqFX8Q84dOLnMB17N4c7tBo1AS/Qi+hTwBH4rwHHwN8DXqQ30XXAS7QaLwSc0Gn8NuAVWou/gFmnjLrEaEh9GmDdDGgL3B4JsrRPDU2hTOiMSuJUIdKQQayiAth69r6akSSFqIJuA19TrzCIaY8sIoxyrNIrL//pw7A2iMygkX5vDj+G+kuoLdX4GlGK/8Lnlz6/h9MpmoO9rafrz7ILXEHHaAx95s9lsI7AHNMBWEZHULnfAXwG9/ZqdzLI08iuwRloXE8kfhXYAvE23+23DU3t626rbs8/8adv+9DWknsHp3E17oCf+Z48rvEQNZ78paYM38qfk3v/u3l3u3GXN2Dmvmvpf1Srwk3pB/VSsp512bA/GG5i2WJ7wu430yQ5K3nFGiOqgtmSB5pJVSizwaacmUZzZhXLlZTq8qGGFY2YcSkqbth6aW1tRmlaCFs2016m5qn36SbJrqosG4uMV4aP2PHBmB3tjtmgN2izkGQyLWprekbIntJFing32a5rKWCN/SdSoga45EJykyQ7asZvHQ8PTm6cslIpwyeyjbVltNikc2HTR7YKh9LBl9DADC0U/jLcBZDKrMhUBfQBvXRzLtFtjU9eNHKin0x5InTqb8lNpfKv1s1xHzTXRqgKzek/mb7nB8RZTCDhGEX3kK/8Q75AmUM/eLkfA+0Hi908Kx4eNsMgudg5GLdRD7a84npi+YxNr5i5KIbW5izXas7cHXIMAau1OueZhfj+cOcP3P8MNIWLyYOBuxL6DRylJ4cAAAB4nGNgYoAALjDJyIAOWMCiTIxMLDmZedkABtIBygAAAA==) format('woff');
-}
-
-.markdown-body {
-  -ms-text-size-adjust: 100%;
-  -webkit-text-size-adjust: 100%;
-  color: #333;
-  overflow: hidden;
-  font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif;
-  font-size: 16px;
-  line-height: 1.6;
-  word-wrap: break-word;
-}
-
-.markdown-body a {
-  background: transparent;
-}
-
-.markdown-body a:active,
-.markdown-body a:hover {
-  outline: 0;
-}
-
-.markdown-body strong {
-  font-weight: bold;
-}
-
-.markdown-body h1 {
-  font-size: 2em;
-  margin: 0.67em 0;
-}
-
-.markdown-body img {
-  border: 0;
-}
-
-.markdown-body hr {
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-  height: 0;
-}
-
-.markdown-body pre {
-  overflow: auto;
-}
-
-.markdown-body code,
-.markdown-body kbd,
-.markdown-body pre {
-  font-family: monospace, monospace;
-  font-size: 1em;
-}
-
-.markdown-body input {
-  color: inherit;
-  font: inherit;
-  margin: 0;
-}
-
-.markdown-body html input[disabled] {
-  cursor: default;
-}
-
-.markdown-body input {
-  line-height: normal;
-}
-
-.markdown-body input[type="checkbox"] {
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  padding: 0;
-}
-
-.markdown-body table {
-  border-collapse: collapse;
-  border-spacing: 0;
-}
-
-.markdown-body td,
-.markdown-body th {
-  padding: 0;
-}
-
-.markdown-body * {
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-
-.markdown-body input {
-  font: 13px/1.4 Helvetica, arial, freesans, clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol";
-}
-
-.markdown-body a {
-  color: #4183c4;
-  text-decoration: none;
-}
-
-.markdown-body a:hover,
-.markdown-body a:focus,
-.markdown-body a:active {
-  text-decoration: underline;
-}
-
-.markdown-body hr {
-  height: 0;
-  margin: 15px 0;
-  overflow: hidden;
-  background: transparent;
-  border: 0;
-  border-bottom: 1px solid #ddd;
-}
-
-.markdown-body hr:before {
-  display: table;
-  content: "";
-}
-
-.markdown-body hr:after {
-  display: table;
-  clear: both;
-  content: "";
-}
-
-.markdown-body h1,
-.markdown-body h2,
-.markdown-body h3,
-.markdown-body h4,
-.markdown-body h5,
-.markdown-body h6 {
-  margin-top: 15px;
-  margin-bottom: 15px;
-  line-height: 1.1;
-}
-
-.markdown-body h1 {
-  font-size: 30px;
-}
-
-.markdown-body h2 {
-  font-size: 21px;
-}
-
-.markdown-body h3 {
-  font-size: 16px;
-}
-
-.markdown-body h4 {
-  font-size: 14px;
-}
-
-.markdown-body h5 {
-  font-size: 12px;
-}
-
-.markdown-body h6 {
-  font-size: 11px;
-}
-
-.markdown-body blockquote {
-  margin: 0;
-}
-
-.markdown-body ul,
-.markdown-body ol {
-  padding: 0;
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-.markdown-body ol ol,
-.markdown-body ul ol {
-  list-style-type: lower-roman;
-}
-
-.markdown-body ul ul ol,
-.markdown-body ul ol ol,
-.markdown-body ol ul ol,
-.markdown-body ol ol ol {
-  list-style-type: lower-alpha;
-}
-
-.markdown-body dd {
-  margin-left: 0;
-}
-
-.markdown-body code {
-  font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace;
-}
-
-.markdown-body pre {
-  margin-top: 0;
-  margin-bottom: 0;
-  font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace;
-}
-
-.markdown-body .octicon {
-  font: normal normal 16px octicons-anchor;
-  line-height: 1;
-  display: inline-block;
-  text-decoration: none;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-
-.markdown-body .octicon-link:before {
-  content: '\f05c';
-}
-
-.markdown-body>*:first-child {
-  margin-top: 0 !important;
-}
-
-.markdown-body>*:last-child {
-  margin-bottom: 0 !important;
-}
-
-.markdown-body .anchor {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  display: block;
-  padding-right: 6px;
-  padding-left: 30px;
-  margin-left: -30px;
-}
-
-.markdown-body .anchor:focus {
-  outline: none;
-}
-
-.markdown-body h1,
-.markdown-body h2,
-.markdown-body h3,
-.markdown-body h4,
-.markdown-body h5,
-.markdown-body h6 {
-  position: relative;
-  margin-top: 1em;
-  margin-bottom: 16px;
-  font-weight: bold;
-  line-height: 1.4;
-}
-
-.markdown-body h1 .octicon-link,
-.markdown-body h2 .octicon-link,
-.markdown-body h3 .octicon-link,
-.markdown-body h4 .octicon-link,
-.markdown-body h5 .octicon-link,
-.markdown-body h6 .octicon-link {
-  display: none;
-  color: #000;
-  vertical-align: middle;
-}
-
-.markdown-body h1:hover .anchor,
-.markdown-body h2:hover .anchor,
-.markdown-body h3:hover .anchor,
-.markdown-body h4:hover .anchor,
-.markdown-body h5:hover .anchor,
-.markdown-body h6:hover .anchor {
-  padding-left: 8px;
-  margin-left: -30px;
-  line-height: 1;
-  text-decoration: none;
-}
-
-.markdown-body h1:hover .anchor .octicon-link,
-.markdown-body h2:hover .anchor .octicon-link,
-.markdown-body h3:hover .anchor .octicon-link,
-.markdown-body h4:hover .anchor .octicon-link,
-.markdown-body h5:hover .anchor .octicon-link,
-.markdown-body h6:hover .anchor .octicon-link {
-  display: inline-block;
-}
-
-.markdown-body h1 {
-  padding-bottom: 0.3em;
-  font-size: 2.25em;
-  line-height: 1.2;
-  border-bottom: 1px solid #eee;
-}
-
-.markdown-body h2 {
-  padding-bottom: 0.3em;
-  font-size: 1.75em;
-  line-height: 1.225;
-  border-bottom: 1px solid #eee;
-}
-
-.markdown-body h3 {
-  font-size: 1.5em;
-  line-height: 1.43;
-}
-
-.markdown-body h4 {
-  font-size: 1.25em;
-}
-
-.markdown-body h5 {
-  font-size: 1em;
-}
-
-.markdown-body h6 {
-  font-size: 1em;
-  color: #777;
-}
-
-.markdown-body p,
-.markdown-body blockquote,
-.markdown-body ul,
-.markdown-body ol,
-.markdown-body dl,
-.markdown-body table,
-.markdown-body pre {
-  margin-top: 0;
-  margin-bottom: 16px;
-}
-
-.markdown-body hr {
-  height: 4px;
-  padding: 0;
-  margin: 16px 0;
-  background-color: #e7e7e7;
-  border: 0 none;
-}
-
-.markdown-body ul,
-.markdown-body ol {
-  padding-left: 2em;
-}
-
-.markdown-body ul ul,
-.markdown-body ul ol,
-.markdown-body ol ol,
-.markdown-body ol ul {
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-.markdown-body li>p {
-  margin-top: 16px;
-}
-
-.markdown-body dl {
-  padding: 0;
-}
-
-.markdown-body dl dt {
-  padding: 0;
-  margin-top: 16px;
-  font-size: 1em;
-  font-style: italic;
-  font-weight: bold;
-}
-
-.markdown-body dl dd {
-  padding: 0 16px;
-  margin-bottom: 16px;
-}
-
-.markdown-body blockquote {
-  padding: 0 15px;
-  color: #777;
-  border-left: 4px solid #ddd;
-}
-
-.markdown-body blockquote>:first-child {
-  margin-top: 0;
-}
-
-.markdown-body blockquote>:last-child {
-  margin-bottom: 0;
-}
-
-.markdown-body table {
-  display: block;
-  width: 100%;
-  overflow: auto;
-  word-break: normal;
-  word-break: keep-all;
-}
-
-.markdown-body table th {
-  font-weight: bold;
-}
-
-.markdown-body table th,
-.markdown-body table td {
-  padding: 6px 13px;
-  border: 1px solid #ddd;
-}
-
-.markdown-body table tr {
-  background-color: #fff;
-  border-top: 1px solid #ccc;
-}
-
-.markdown-body table tr:nth-child(2n) {
-  background-color: #f8f8f8;
-}
-
-.markdown-body img {
-  max-width: 100%;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-
-.markdown-body code {
-  padding: 0;
-  padding-top: 0.2em;
-  padding-bottom: 0.2em;
-  margin: 0;
-  font-size: 85%;
-  background-color: rgba(0,0,0,0.04);
-  border-radius: 3px;
-}
-
-.markdown-body code:before,
-.markdown-body code:after {
-  letter-spacing: -0.2em;
-  content: "\00a0";
-}
-
-.markdown-body pre>code {
-  padding: 0;
-  margin: 0;
-  font-size: 100%;
-  word-break: normal;
-  white-space: pre;
-  background: transparent;
-  border: 0;
-}
-
-.markdown-body .highlight {
-  margin-bottom: 16px;
-}
-
-.markdown-body .highlight pre,
-.markdown-body pre {
-  padding: 16px;
-  overflow: auto;
-  font-size: 85%;
-  line-height: 1.45;
-  background-color: #f7f7f7;
-  border-radius: 3px;
-}
-
-.markdown-body .highlight pre {
-  margin-bottom: 0;
-  word-break: normal;
-}
-
-.markdown-body pre {
-  word-wrap: normal;
-}
-
-.markdown-body pre code {
-  display: inline;
-  max-width: initial;
-  padding: 0;
-  margin: 0;
-  overflow: initial;
-  line-height: inherit;
-  word-wrap: normal;
-  background-color: transparent;
-  border: 0;
-}
-
-.markdown-body pre code:before,
-.markdown-body pre code:after {
-  content: normal;
-}
-
-.markdown-body .highlight {
-  background: #fff;
-}
-
-.markdown-body .highlight .h {
-  color: #333;
-  font-style: normal;
-  font-weight: normal;
-}
-
-.markdown-body .highlight .mf,
-.markdown-body .highlight .mh,
-.markdown-body .highlight .mi,
-.markdown-body .highlight .mo,
-.markdown-body .highlight .il,
-.markdown-body .highlight .m {
-  color: #945277;
-}
-
-.markdown-body .highlight .s,
-.markdown-body .highlight .sb,
-.markdown-body .highlight .sc,
-.markdown-body .highlight .sd,
-.markdown-body .highlight .s2,
-.markdown-body .highlight .se,
-.markdown-body .highlight .sh,
-.markdown-body .highlight .si,
-.markdown-body .highlight .sx,
-.markdown-body .highlight .s1 {
-  color: #df5000;
-}
-
-.markdown-body .highlight .kc,
-.markdown-body .highlight .kd,
-.markdown-body .highlight .kn,
-.markdown-body .highlight .kp,
-.markdown-body .highlight .kr,
-.markdown-body .highlight .kt,
-.markdown-body .highlight .k,
-.markdown-body .highlight .o {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .kt {
-  color: #458;
-}
-
-.markdown-body .highlight .c,
-.markdown-body .highlight .cm,
-.markdown-body .highlight .c1 {
-  color: #998;
-  font-style: italic;
-}
-
-.markdown-body .highlight .cp,
-.markdown-body .highlight .cs,
-.markdown-body .highlight .cp .h {
-  color: #999;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .cs {
-  font-style: italic;
-}
-
-.markdown-body .highlight .n {
-  color: #333;
-}
-
-.markdown-body .highlight .na,
-.markdown-body .highlight .nv,
-.markdown-body .highlight .vc,
-.markdown-body .highlight .vg,
-.markdown-body .highlight .vi {
-  color: #008080;
-}
-
-.markdown-body .highlight .nb {
-  color: #0086B3;
-}
-
-.markdown-body .highlight .nc {
-  color: #458;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .no {
-  color: #094e99;
-}
-
-.markdown-body .highlight .ni {
-  color: #800080;
-}
-
-.markdown-body .highlight .ne {
-  color: #990000;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .nf {
-  color: #945277;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .nn {
-  color: #555;
-}
-
-.markdown-body .highlight .nt {
-  color: #000080;
-}
-
-.markdown-body .highlight .err {
-  color: #a61717;
-  background-color: #e3d2d2;
-}
-
-.markdown-body .highlight .gd {
-  color: #000;
-  background-color: #fdd;
-}
-
-.markdown-body .highlight .gd .x {
-  color: #000;
-  background-color: #faa;
-}
-
-.markdown-body .highlight .ge {
-  font-style: italic;
-}
-
-.markdown-body .highlight .gr {
-  color: #aa0000;
-}
-
-.markdown-body .highlight .gh {
-  color: #999;
-}
-
-.markdown-body .highlight .gi {
-  color: #000;
-  background-color: #dfd;
-}
-
-.markdown-body .highlight .gi .x {
-  color: #000;
-  background-color: #afa;
-}
-
-.markdown-body .highlight .go {
-  color: #888;
-}
-
-.markdown-body .highlight .gp {
-  color: #555;
-}
-
-.markdown-body .highlight .gs {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .gu {
-  color: #800080;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .gt {
-  color: #aa0000;
-}
-
-.markdown-body .highlight .ow {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .w {
-  color: #bbb;
-}
-
-.markdown-body .highlight .sr {
-  color: #017936;
-}
-
-.markdown-body .highlight .ss {
-  color: #8b467f;
-}
-
-.markdown-body .highlight .bp {
-  color: #999;
-}
-
-.markdown-body .highlight .gc {
-  color: #999;
-  background-color: #EAF2F5;
-}
-
-.markdown-body kbd {
-  background-color: #e7e7e7;
-  background-image: -webkit-linear-gradient(#fefefe, #e7e7e7);
-  background-image: linear-gradient(#fefefe, #e7e7e7);
-  background-repeat: repeat-x;
-  display: inline-block;
-  padding: 3px 5px;
-  font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace;
-  line-height: 10px;
-  color: #000;
-  border: 1px solid #cfcfcf;
-  border-radius: 2px;
-}
-
-.markdown-body .highlight .pl-coc,
-.markdown-body .highlight .pl-entm,
-.markdown-body .highlight .pl-eoa,
-.markdown-body .highlight .pl-mai .pl-sf,
-.markdown-body .highlight .pl-pdv,
-.markdown-body .highlight .pl-sc,
-.markdown-body .highlight .pl-sr,
-.markdown-body .highlight .pl-v,
-.markdown-body .highlight .pl-vpf {
-  color: #0086b3;
-}
-
-.markdown-body .highlight .pl-eoac,
-.markdown-body .highlight .pl-mdht,
-.markdown-body .highlight .pl-mi1,
-.markdown-body .highlight .pl-mri,
-.markdown-body .highlight .pl-va,
-.markdown-body .highlight .pl-vpu {
-  color: #008080;
-}
-
-.markdown-body .highlight .pl-c,
-.markdown-body .highlight .pl-pdc {
-  color: #b4b7b4;
-  font-style: italic;
-}
-
-.markdown-body .highlight .pl-k,
-.markdown-body .highlight .pl-ko,
-.markdown-body .highlight .pl-kolp,
-.markdown-body .highlight .pl-mc,
-.markdown-body .highlight .pl-mr,
-.markdown-body .highlight .pl-ms,
-.markdown-body .highlight .pl-s,
-.markdown-body .highlight .pl-sok,
-.markdown-body .highlight .pl-st {
-  color: #6e5494;
-}
-
-.markdown-body .highlight .pl-ef,
-.markdown-body .highlight .pl-enf,
-.markdown-body .highlight .pl-enm,
-.markdown-body .highlight .pl-entc,
-.markdown-body .highlight .pl-eoi,
-.markdown-body .highlight .pl-sf,
-.markdown-body .highlight .pl-smc {
-  color: #d12089;
-}
-
-.markdown-body .highlight .pl-ens,
-.markdown-body .highlight .pl-eoai,
-.markdown-body .highlight .pl-kos,
-.markdown-body .highlight .pl-mh .pl-pdh,
-.markdown-body .highlight .pl-mp,
-.markdown-body .highlight .pl-pde,
-.markdown-body .highlight .pl-stp {
-  color: #458;
-}
-
-.markdown-body .highlight .pl-enti {
-  color: #d12089;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-cce,
-.markdown-body .highlight .pl-enc,
-.markdown-body .highlight .pl-kou,
-.markdown-body .highlight .pl-mq {
-  color: #f93;
-}
-
-.markdown-body .highlight .pl-mp1 .pl-sf {
-  color: #458;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-cos,
-.markdown-body .highlight .pl-ent,
-.markdown-body .highlight .pl-md,
-.markdown-body .highlight .pl-mdhf,
-.markdown-body .highlight .pl-ml,
-.markdown-body .highlight .pl-pdc1,
-.markdown-body .highlight .pl-pds,
-.markdown-body .highlight .pl-s1,
-.markdown-body .highlight .pl-scp,
-.markdown-body .highlight .pl-sol {
-  color: #df5000;
-}
-
-.markdown-body .highlight .pl-c1,
-.markdown-body .highlight .pl-cn,
-.markdown-body .highlight .pl-pse,
-.markdown-body .highlight .pl-pse .pl-s2,
-.markdown-body .highlight .pl-vi {
-  color: #a31515;
-}
-
-.markdown-body .highlight .pl-mb,
-.markdown-body .highlight .pl-pdb {
-  color: #df5000;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-mi,
-.markdown-body .highlight .pl-pdi {
-  color: #6e5494;
-  font-style: italic;
-}
-
-.markdown-body .highlight .pl-ms1 {
-  background-color: #f5f5f5;
-}
-
-.markdown-body .highlight .pl-mdh,
-.markdown-body .highlight .pl-mdi {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-mdr {
-  color: #0086b3;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-s2 {
-  color: #333;
-}
-
-.markdown-body .highlight .pl-ii {
-  background-color: #df5000;
-  color: #fff;
-}
-
-.markdown-body .highlight .pl-ib {
-  background-color: #f93;
-}
-
-.markdown-body .highlight .pl-id {
-  background-color: #a31515;
-  color: #fff;
-}
-
-.markdown-body .highlight .pl-iu {
-  background-color: #b4b7b4;
-}
-
-.markdown-body .highlight .pl-mo {
-  color: #969896;
-}
-
-.markdown-body .task-list-item {
-  list-style-type: none;
-}
-
-.markdown-body .task-list-item+.task-list-item {
-  margin-top: 3px;
-}
-
-.markdown-body .task-list-item input {
-  float: left;
-  margin: 0.3em 0 0.25em -1.6em;
-  vertical-align: middle;
-}</style><title>index</title></head><body><article class="markdown-body"><h1 id="readme">
-<a id="user-content-readme" class="anchor" href="#readme" aria-hidden="true"><span class="octicon octicon-link"></span></a>README</h1>
-
-<h2 id="%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0">
-<a id="user-content-Подготовка" class="anchor" href="#%D0%9F%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0" aria-hidden="true"><span class="octicon octicon-link"></span></a>Подготовка</h2>
-
-<ul>
-<li><a href="installation.html#%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0">Настройка доступа</a></li>
-<li><a href="%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%BF%D0%BE">Настройка ПО</a></li>
-<li><a href="%D0%BA%D0%B0%D0%BA-%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-dev_rating">Как поставить dev_rating?</a></li>
-</ul>
-
-<h2 id="unittest">
-<a id="user-content-unittest" class="anchor" href="#unittest" aria-hidden="true"><span class="octicon octicon-link"></span></a>UnitTest</h2>
-
-<h5 id="phpunit">
-<a id="user-content-phpunit" class="anchor" href="#phpunit" aria-hidden="true"><span class="octicon octicon-link"></span></a>PHPUnit</h5>
-
-<ul>
-<li><a href="testing/phpunit.html">Unit testing</a></li>
-<li><a href="testing/phpunit.html#composer">Composer</a></li>
-<li><a href="testing/phpunit.html#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B2%D0%BD%D0%B5-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0">Установка вне проекта</a></li>
-<li><a href="testing/phpunit.html#%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D1%81-phpstorm">Интеграция с PHPStorm</a></li>
-</ul>
-
-<h5 id="kohana-integration">
-<a id="user-content-kohana-integration" class="anchor" href="#kohana-integration" aria-hidden="true"><span class="octicon octicon-link"></span></a>Kohana integration</h5>
-
-<ul>
-<li><a href="testing/kohana/mockobjects.html#mock-objects">Mock Objects</a></li>
-<li><a href="testing/kohana/usage.html#usage">Usage</a></li>
-<li><a href="testing/kohana/testing_workflows.html#testing-workflows">Testing workflows</a></li>
-<li><a href="testing/kohana/troubleshooting.html#troubleshooting">Troubleshooting</a></li>
-</ul>
-</article></body></html>
\ No newline at end of file
diff --git a/doc/dev/index.md b/doc/dev/index.md
deleted file mode 100644
index 64106e5702bef81f66b48c47898fc590615a427f..0000000000000000000000000000000000000000
--- a/doc/dev/index.md
+++ /dev/null
@@ -1,22 +0,0 @@
-
-# README
-
-## Подготовка
-
-- [Настройка доступа](installation.html#%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0)
-- [Настройка ПО](%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%BF%D0%BE)
-- [Как поставить dev_rating?](%D0%BA%D0%B0%D0%BA-%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-dev_rating)
-
-## UnitTest
-
-##### PHPUnit
-- [Unit testing](testing/phpunit.html)
-- [Composer](testing/phpunit.html#composer)
-- [Установка вне проекта](testing/phpunit.html#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B2%D0%BD%D0%B5-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0)
-- [Интеграция с PHPStorm](testing/phpunit.html#%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D1%81-phpstorm)
-
-##### Kohana integration
-- [Mock Objects](testing/kohana/mockobjects.html#mock-objects)
-- [Usage](testing/kohana/usage.html#usage)
-- [Testing workflows](testing/kohana/testing_workflows.html#testing-workflows)
-- [Troubleshooting](testing/kohana/troubleshooting.html#troubleshooting)
diff --git a/doc/dev/installation.html b/doc/dev/installation.html
deleted file mode 100644
index b49f7bb10a689a24baaf7b2150ec02710f81bc86..0000000000000000000000000000000000000000
--- a/doc/dev/installation.html
+++ /dev/null
@@ -1,949 +0,0 @@
-<!DOCTYPE html><html><head><meta charset="utf-8"><style>body {
-  width: 45em;
-  border: 1px solid #ddd;
-  outline: 1300px solid #fff;
-  margin: 16px auto;
-}
-
-body .markdown-body
-{
-  padding: 30px;
-}
-
-@font-face {
-  font-family: octicons-anchor;
-  src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAYcAA0AAAAACjQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABMAAAABwAAAAca8vGTk9TLzIAAAFMAAAARAAAAFZG1VHVY21hcAAAAZAAAAA+AAABQgAP9AdjdnQgAAAB0AAAAAQAAAAEACICiGdhc3AAAAHUAAAACAAAAAj//wADZ2x5ZgAAAdwAAADRAAABEKyikaNoZWFkAAACsAAAAC0AAAA2AtXoA2hoZWEAAALgAAAAHAAAACQHngNFaG10eAAAAvwAAAAQAAAAEAwAACJsb2NhAAADDAAAAAoAAAAKALIAVG1heHAAAAMYAAAAHwAAACABEAB2bmFtZQAAAzgAAALBAAAFu3I9x/Nwb3N0AAAF/AAAAB0AAAAvaoFvbwAAAAEAAAAAzBdyYwAAAADP2IQvAAAAAM/bz7t4nGNgZGFgnMDAysDB1Ml0hoGBoR9CM75mMGLkYGBgYmBlZsAKAtJcUxgcPsR8iGF2+O/AEMPsznAYKMwIkgMA5REMOXicY2BgYGaAYBkGRgYQsAHyGMF8FgYFIM0ChED+h5j//yEk/3KoSgZGNgYYk4GRCUgwMaACRoZhDwCs7QgGAAAAIgKIAAAAAf//AAJ4nHWMMQrCQBBF/0zWrCCIKUQsTDCL2EXMohYGSSmorScInsRGL2DOYJe0Ntp7BK+gJ1BxF1stZvjz/v8DRghQzEc4kIgKwiAppcA9LtzKLSkdNhKFY3HF4lK69ExKslx7Xa+vPRVS43G98vG1DnkDMIBUgFN0MDXflU8tbaZOUkXUH0+U27RoRpOIyCKjbMCVejwypzJJG4jIwb43rfl6wbwanocrJm9XFYfskuVC5K/TPyczNU7b84CXcbxks1Un6H6tLH9vf2LRnn8Ax7A5WQAAAHicY2BkYGAA4teL1+yI57f5ysDNwgAC529f0kOmWRiYVgEpDgYmEA8AUzEKsQAAAHicY2BkYGB2+O/AEMPCAAJAkpEBFbAAADgKAe0EAAAiAAAAAAQAAAAEAAAAAAAAKgAqACoAiAAAeJxjYGRgYGBhsGFgYgABEMkFhAwM/xn0QAIAD6YBhwB4nI1Ty07cMBS9QwKlQapQW3VXySvEqDCZGbGaHULiIQ1FKgjWMxknMfLEke2A+IJu+wntrt/QbVf9gG75jK577Lg8K1qQPCfnnnt8fX1NRC/pmjrk/zprC+8D7tBy9DHgBXoWfQ44Av8t4Bj4Z8CLtBL9CniJluPXASf0Lm4CXqFX8Q84dOLnMB17N4c7tBo1AS/Qi+hTwBH4rwHHwN8DXqQ30XXAS7QaLwSc0Gn8NuAVWou/gFmnjLrEaEh9GmDdDGgL3B4JsrRPDU2hTOiMSuJUIdKQQayiAth69r6akSSFqIJuA19TrzCIaY8sIoxyrNIrL//pw7A2iMygkX5vDj+G+kuoLdX4GlGK/8Lnlz6/h9MpmoO9rafrz7ILXEHHaAx95s9lsI7AHNMBWEZHULnfAXwG9/ZqdzLI08iuwRloXE8kfhXYAvE23+23DU3t626rbs8/8adv+9DWknsHp3E17oCf+Z48rvEQNZ78paYM38qfk3v/u3l3u3GXN2Dmvmvpf1Srwk3pB/VSsp512bA/GG5i2WJ7wu430yQ5K3nFGiOqgtmSB5pJVSizwaacmUZzZhXLlZTq8qGGFY2YcSkqbth6aW1tRmlaCFs2016m5qn36SbJrqosG4uMV4aP2PHBmB3tjtmgN2izkGQyLWprekbIntJFing32a5rKWCN/SdSoga45EJykyQ7asZvHQ8PTm6cslIpwyeyjbVltNikc2HTR7YKh9LBl9DADC0U/jLcBZDKrMhUBfQBvXRzLtFtjU9eNHKin0x5InTqb8lNpfKv1s1xHzTXRqgKzek/mb7nB8RZTCDhGEX3kK/8Q75AmUM/eLkfA+0Hi908Kx4eNsMgudg5GLdRD7a84npi+YxNr5i5KIbW5izXas7cHXIMAau1OueZhfj+cOcP3P8MNIWLyYOBuxL6DRylJ4cAAAB4nGNgYoAALjDJyIAOWMCiTIxMLDmZedkABtIBygAAAA==) format('woff');
-}
-
-.markdown-body {
-  -ms-text-size-adjust: 100%;
-  -webkit-text-size-adjust: 100%;
-  color: #333;
-  overflow: hidden;
-  font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif;
-  font-size: 16px;
-  line-height: 1.6;
-  word-wrap: break-word;
-}
-
-.markdown-body a {
-  background: transparent;
-}
-
-.markdown-body a:active,
-.markdown-body a:hover {
-  outline: 0;
-}
-
-.markdown-body strong {
-  font-weight: bold;
-}
-
-.markdown-body h1 {
-  font-size: 2em;
-  margin: 0.67em 0;
-}
-
-.markdown-body img {
-  border: 0;
-}
-
-.markdown-body hr {
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-  height: 0;
-}
-
-.markdown-body pre {
-  overflow: auto;
-}
-
-.markdown-body code,
-.markdown-body kbd,
-.markdown-body pre {
-  font-family: monospace, monospace;
-  font-size: 1em;
-}
-
-.markdown-body input {
-  color: inherit;
-  font: inherit;
-  margin: 0;
-}
-
-.markdown-body html input[disabled] {
-  cursor: default;
-}
-
-.markdown-body input {
-  line-height: normal;
-}
-
-.markdown-body input[type="checkbox"] {
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  padding: 0;
-}
-
-.markdown-body table {
-  border-collapse: collapse;
-  border-spacing: 0;
-}
-
-.markdown-body td,
-.markdown-body th {
-  padding: 0;
-}
-
-.markdown-body * {
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-
-.markdown-body input {
-  font: 13px/1.4 Helvetica, arial, freesans, clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol";
-}
-
-.markdown-body a {
-  color: #4183c4;
-  text-decoration: none;
-}
-
-.markdown-body a:hover,
-.markdown-body a:focus,
-.markdown-body a:active {
-  text-decoration: underline;
-}
-
-.markdown-body hr {
-  height: 0;
-  margin: 15px 0;
-  overflow: hidden;
-  background: transparent;
-  border: 0;
-  border-bottom: 1px solid #ddd;
-}
-
-.markdown-body hr:before {
-  display: table;
-  content: "";
-}
-
-.markdown-body hr:after {
-  display: table;
-  clear: both;
-  content: "";
-}
-
-.markdown-body h1,
-.markdown-body h2,
-.markdown-body h3,
-.markdown-body h4,
-.markdown-body h5,
-.markdown-body h6 {
-  margin-top: 15px;
-  margin-bottom: 15px;
-  line-height: 1.1;
-}
-
-.markdown-body h1 {
-  font-size: 30px;
-}
-
-.markdown-body h2 {
-  font-size: 21px;
-}
-
-.markdown-body h3 {
-  font-size: 16px;
-}
-
-.markdown-body h4 {
-  font-size: 14px;
-}
-
-.markdown-body h5 {
-  font-size: 12px;
-}
-
-.markdown-body h6 {
-  font-size: 11px;
-}
-
-.markdown-body blockquote {
-  margin: 0;
-}
-
-.markdown-body ul,
-.markdown-body ol {
-  padding: 0;
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-.markdown-body ol ol,
-.markdown-body ul ol {
-  list-style-type: lower-roman;
-}
-
-.markdown-body ul ul ol,
-.markdown-body ul ol ol,
-.markdown-body ol ul ol,
-.markdown-body ol ol ol {
-  list-style-type: lower-alpha;
-}
-
-.markdown-body dd {
-  margin-left: 0;
-}
-
-.markdown-body code {
-  font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace;
-}
-
-.markdown-body pre {
-  margin-top: 0;
-  margin-bottom: 0;
-  font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace;
-}
-
-.markdown-body .octicon {
-  font: normal normal 16px octicons-anchor;
-  line-height: 1;
-  display: inline-block;
-  text-decoration: none;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-
-.markdown-body .octicon-link:before {
-  content: '\f05c';
-}
-
-.markdown-body>*:first-child {
-  margin-top: 0 !important;
-}
-
-.markdown-body>*:last-child {
-  margin-bottom: 0 !important;
-}
-
-.markdown-body .anchor {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  display: block;
-  padding-right: 6px;
-  padding-left: 30px;
-  margin-left: -30px;
-}
-
-.markdown-body .anchor:focus {
-  outline: none;
-}
-
-.markdown-body h1,
-.markdown-body h2,
-.markdown-body h3,
-.markdown-body h4,
-.markdown-body h5,
-.markdown-body h6 {
-  position: relative;
-  margin-top: 1em;
-  margin-bottom: 16px;
-  font-weight: bold;
-  line-height: 1.4;
-}
-
-.markdown-body h1 .octicon-link,
-.markdown-body h2 .octicon-link,
-.markdown-body h3 .octicon-link,
-.markdown-body h4 .octicon-link,
-.markdown-body h5 .octicon-link,
-.markdown-body h6 .octicon-link {
-  display: none;
-  color: #000;
-  vertical-align: middle;
-}
-
-.markdown-body h1:hover .anchor,
-.markdown-body h2:hover .anchor,
-.markdown-body h3:hover .anchor,
-.markdown-body h4:hover .anchor,
-.markdown-body h5:hover .anchor,
-.markdown-body h6:hover .anchor {
-  padding-left: 8px;
-  margin-left: -30px;
-  line-height: 1;
-  text-decoration: none;
-}
-
-.markdown-body h1:hover .anchor .octicon-link,
-.markdown-body h2:hover .anchor .octicon-link,
-.markdown-body h3:hover .anchor .octicon-link,
-.markdown-body h4:hover .anchor .octicon-link,
-.markdown-body h5:hover .anchor .octicon-link,
-.markdown-body h6:hover .anchor .octicon-link {
-  display: inline-block;
-}
-
-.markdown-body h1 {
-  padding-bottom: 0.3em;
-  font-size: 2.25em;
-  line-height: 1.2;
-  border-bottom: 1px solid #eee;
-}
-
-.markdown-body h2 {
-  padding-bottom: 0.3em;
-  font-size: 1.75em;
-  line-height: 1.225;
-  border-bottom: 1px solid #eee;
-}
-
-.markdown-body h3 {
-  font-size: 1.5em;
-  line-height: 1.43;
-}
-
-.markdown-body h4 {
-  font-size: 1.25em;
-}
-
-.markdown-body h5 {
-  font-size: 1em;
-}
-
-.markdown-body h6 {
-  font-size: 1em;
-  color: #777;
-}
-
-.markdown-body p,
-.markdown-body blockquote,
-.markdown-body ul,
-.markdown-body ol,
-.markdown-body dl,
-.markdown-body table,
-.markdown-body pre {
-  margin-top: 0;
-  margin-bottom: 16px;
-}
-
-.markdown-body hr {
-  height: 4px;
-  padding: 0;
-  margin: 16px 0;
-  background-color: #e7e7e7;
-  border: 0 none;
-}
-
-.markdown-body ul,
-.markdown-body ol {
-  padding-left: 2em;
-}
-
-.markdown-body ul ul,
-.markdown-body ul ol,
-.markdown-body ol ol,
-.markdown-body ol ul {
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-.markdown-body li>p {
-  margin-top: 16px;
-}
-
-.markdown-body dl {
-  padding: 0;
-}
-
-.markdown-body dl dt {
-  padding: 0;
-  margin-top: 16px;
-  font-size: 1em;
-  font-style: italic;
-  font-weight: bold;
-}
-
-.markdown-body dl dd {
-  padding: 0 16px;
-  margin-bottom: 16px;
-}
-
-.markdown-body blockquote {
-  padding: 0 15px;
-  color: #777;
-  border-left: 4px solid #ddd;
-}
-
-.markdown-body blockquote>:first-child {
-  margin-top: 0;
-}
-
-.markdown-body blockquote>:last-child {
-  margin-bottom: 0;
-}
-
-.markdown-body table {
-  display: block;
-  width: 100%;
-  overflow: auto;
-  word-break: normal;
-  word-break: keep-all;
-}
-
-.markdown-body table th {
-  font-weight: bold;
-}
-
-.markdown-body table th,
-.markdown-body table td {
-  padding: 6px 13px;
-  border: 1px solid #ddd;
-}
-
-.markdown-body table tr {
-  background-color: #fff;
-  border-top: 1px solid #ccc;
-}
-
-.markdown-body table tr:nth-child(2n) {
-  background-color: #f8f8f8;
-}
-
-.markdown-body img {
-  max-width: 100%;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-
-.markdown-body code {
-  padding: 0;
-  padding-top: 0.2em;
-  padding-bottom: 0.2em;
-  margin: 0;
-  font-size: 85%;
-  background-color: rgba(0,0,0,0.04);
-  border-radius: 3px;
-}
-
-.markdown-body code:before,
-.markdown-body code:after {
-  letter-spacing: -0.2em;
-  content: "\00a0";
-}
-
-.markdown-body pre>code {
-  padding: 0;
-  margin: 0;
-  font-size: 100%;
-  word-break: normal;
-  white-space: pre;
-  background: transparent;
-  border: 0;
-}
-
-.markdown-body .highlight {
-  margin-bottom: 16px;
-}
-
-.markdown-body .highlight pre,
-.markdown-body pre {
-  padding: 16px;
-  overflow: auto;
-  font-size: 85%;
-  line-height: 1.45;
-  background-color: #f7f7f7;
-  border-radius: 3px;
-}
-
-.markdown-body .highlight pre {
-  margin-bottom: 0;
-  word-break: normal;
-}
-
-.markdown-body pre {
-  word-wrap: normal;
-}
-
-.markdown-body pre code {
-  display: inline;
-  max-width: initial;
-  padding: 0;
-  margin: 0;
-  overflow: initial;
-  line-height: inherit;
-  word-wrap: normal;
-  background-color: transparent;
-  border: 0;
-}
-
-.markdown-body pre code:before,
-.markdown-body pre code:after {
-  content: normal;
-}
-
-.markdown-body .highlight {
-  background: #fff;
-}
-
-.markdown-body .highlight .h {
-  color: #333;
-  font-style: normal;
-  font-weight: normal;
-}
-
-.markdown-body .highlight .mf,
-.markdown-body .highlight .mh,
-.markdown-body .highlight .mi,
-.markdown-body .highlight .mo,
-.markdown-body .highlight .il,
-.markdown-body .highlight .m {
-  color: #945277;
-}
-
-.markdown-body .highlight .s,
-.markdown-body .highlight .sb,
-.markdown-body .highlight .sc,
-.markdown-body .highlight .sd,
-.markdown-body .highlight .s2,
-.markdown-body .highlight .se,
-.markdown-body .highlight .sh,
-.markdown-body .highlight .si,
-.markdown-body .highlight .sx,
-.markdown-body .highlight .s1 {
-  color: #df5000;
-}
-
-.markdown-body .highlight .kc,
-.markdown-body .highlight .kd,
-.markdown-body .highlight .kn,
-.markdown-body .highlight .kp,
-.markdown-body .highlight .kr,
-.markdown-body .highlight .kt,
-.markdown-body .highlight .k,
-.markdown-body .highlight .o {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .kt {
-  color: #458;
-}
-
-.markdown-body .highlight .c,
-.markdown-body .highlight .cm,
-.markdown-body .highlight .c1 {
-  color: #998;
-  font-style: italic;
-}
-
-.markdown-body .highlight .cp,
-.markdown-body .highlight .cs,
-.markdown-body .highlight .cp .h {
-  color: #999;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .cs {
-  font-style: italic;
-}
-
-.markdown-body .highlight .n {
-  color: #333;
-}
-
-.markdown-body .highlight .na,
-.markdown-body .highlight .nv,
-.markdown-body .highlight .vc,
-.markdown-body .highlight .vg,
-.markdown-body .highlight .vi {
-  color: #008080;
-}
-
-.markdown-body .highlight .nb {
-  color: #0086B3;
-}
-
-.markdown-body .highlight .nc {
-  color: #458;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .no {
-  color: #094e99;
-}
-
-.markdown-body .highlight .ni {
-  color: #800080;
-}
-
-.markdown-body .highlight .ne {
-  color: #990000;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .nf {
-  color: #945277;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .nn {
-  color: #555;
-}
-
-.markdown-body .highlight .nt {
-  color: #000080;
-}
-
-.markdown-body .highlight .err {
-  color: #a61717;
-  background-color: #e3d2d2;
-}
-
-.markdown-body .highlight .gd {
-  color: #000;
-  background-color: #fdd;
-}
-
-.markdown-body .highlight .gd .x {
-  color: #000;
-  background-color: #faa;
-}
-
-.markdown-body .highlight .ge {
-  font-style: italic;
-}
-
-.markdown-body .highlight .gr {
-  color: #aa0000;
-}
-
-.markdown-body .highlight .gh {
-  color: #999;
-}
-
-.markdown-body .highlight .gi {
-  color: #000;
-  background-color: #dfd;
-}
-
-.markdown-body .highlight .gi .x {
-  color: #000;
-  background-color: #afa;
-}
-
-.markdown-body .highlight .go {
-  color: #888;
-}
-
-.markdown-body .highlight .gp {
-  color: #555;
-}
-
-.markdown-body .highlight .gs {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .gu {
-  color: #800080;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .gt {
-  color: #aa0000;
-}
-
-.markdown-body .highlight .ow {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .w {
-  color: #bbb;
-}
-
-.markdown-body .highlight .sr {
-  color: #017936;
-}
-
-.markdown-body .highlight .ss {
-  color: #8b467f;
-}
-
-.markdown-body .highlight .bp {
-  color: #999;
-}
-
-.markdown-body .highlight .gc {
-  color: #999;
-  background-color: #EAF2F5;
-}
-
-.markdown-body kbd {
-  background-color: #e7e7e7;
-  background-image: -webkit-linear-gradient(#fefefe, #e7e7e7);
-  background-image: linear-gradient(#fefefe, #e7e7e7);
-  background-repeat: repeat-x;
-  display: inline-block;
-  padding: 3px 5px;
-  font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace;
-  line-height: 10px;
-  color: #000;
-  border: 1px solid #cfcfcf;
-  border-radius: 2px;
-}
-
-.markdown-body .highlight .pl-coc,
-.markdown-body .highlight .pl-entm,
-.markdown-body .highlight .pl-eoa,
-.markdown-body .highlight .pl-mai .pl-sf,
-.markdown-body .highlight .pl-pdv,
-.markdown-body .highlight .pl-sc,
-.markdown-body .highlight .pl-sr,
-.markdown-body .highlight .pl-v,
-.markdown-body .highlight .pl-vpf {
-  color: #0086b3;
-}
-
-.markdown-body .highlight .pl-eoac,
-.markdown-body .highlight .pl-mdht,
-.markdown-body .highlight .pl-mi1,
-.markdown-body .highlight .pl-mri,
-.markdown-body .highlight .pl-va,
-.markdown-body .highlight .pl-vpu {
-  color: #008080;
-}
-
-.markdown-body .highlight .pl-c,
-.markdown-body .highlight .pl-pdc {
-  color: #b4b7b4;
-  font-style: italic;
-}
-
-.markdown-body .highlight .pl-k,
-.markdown-body .highlight .pl-ko,
-.markdown-body .highlight .pl-kolp,
-.markdown-body .highlight .pl-mc,
-.markdown-body .highlight .pl-mr,
-.markdown-body .highlight .pl-ms,
-.markdown-body .highlight .pl-s,
-.markdown-body .highlight .pl-sok,
-.markdown-body .highlight .pl-st {
-  color: #6e5494;
-}
-
-.markdown-body .highlight .pl-ef,
-.markdown-body .highlight .pl-enf,
-.markdown-body .highlight .pl-enm,
-.markdown-body .highlight .pl-entc,
-.markdown-body .highlight .pl-eoi,
-.markdown-body .highlight .pl-sf,
-.markdown-body .highlight .pl-smc {
-  color: #d12089;
-}
-
-.markdown-body .highlight .pl-ens,
-.markdown-body .highlight .pl-eoai,
-.markdown-body .highlight .pl-kos,
-.markdown-body .highlight .pl-mh .pl-pdh,
-.markdown-body .highlight .pl-mp,
-.markdown-body .highlight .pl-pde,
-.markdown-body .highlight .pl-stp {
-  color: #458;
-}
-
-.markdown-body .highlight .pl-enti {
-  color: #d12089;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-cce,
-.markdown-body .highlight .pl-enc,
-.markdown-body .highlight .pl-kou,
-.markdown-body .highlight .pl-mq {
-  color: #f93;
-}
-
-.markdown-body .highlight .pl-mp1 .pl-sf {
-  color: #458;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-cos,
-.markdown-body .highlight .pl-ent,
-.markdown-body .highlight .pl-md,
-.markdown-body .highlight .pl-mdhf,
-.markdown-body .highlight .pl-ml,
-.markdown-body .highlight .pl-pdc1,
-.markdown-body .highlight .pl-pds,
-.markdown-body .highlight .pl-s1,
-.markdown-body .highlight .pl-scp,
-.markdown-body .highlight .pl-sol {
-  color: #df5000;
-}
-
-.markdown-body .highlight .pl-c1,
-.markdown-body .highlight .pl-cn,
-.markdown-body .highlight .pl-pse,
-.markdown-body .highlight .pl-pse .pl-s2,
-.markdown-body .highlight .pl-vi {
-  color: #a31515;
-}
-
-.markdown-body .highlight .pl-mb,
-.markdown-body .highlight .pl-pdb {
-  color: #df5000;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-mi,
-.markdown-body .highlight .pl-pdi {
-  color: #6e5494;
-  font-style: italic;
-}
-
-.markdown-body .highlight .pl-ms1 {
-  background-color: #f5f5f5;
-}
-
-.markdown-body .highlight .pl-mdh,
-.markdown-body .highlight .pl-mdi {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-mdr {
-  color: #0086b3;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-s2 {
-  color: #333;
-}
-
-.markdown-body .highlight .pl-ii {
-  background-color: #df5000;
-  color: #fff;
-}
-
-.markdown-body .highlight .pl-ib {
-  background-color: #f93;
-}
-
-.markdown-body .highlight .pl-id {
-  background-color: #a31515;
-  color: #fff;
-}
-
-.markdown-body .highlight .pl-iu {
-  background-color: #b4b7b4;
-}
-
-.markdown-body .highlight .pl-mo {
-  color: #969896;
-}
-
-.markdown-body .task-list-item {
-  list-style-type: none;
-}
-
-.markdown-body .task-list-item+.task-list-item {
-  margin-top: 3px;
-}
-
-.markdown-body .task-list-item input {
-  float: left;
-  margin: 0.3em 0 0.25em -1.6em;
-  vertical-align: middle;
-}</style><title>installation</title></head><body><article class="markdown-body"><h2 id="%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0">
-<a id="user-content-Настройка-доступа" class="anchor" href="#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0" aria-hidden="true"><span class="octicon octicon-link"></span></a>Настройка доступа</h2>
-
-<h4 id="redmine">
-<a id="user-content-redmine" class="anchor" href="#redmine" aria-hidden="true"><span class="octicon octicon-link"></span></a>Redmine</h4>
-
-<ul>
-<li>Регистрируемся на сайте <a href="http://itlab.mmcs.sfedu.ru/redmine/">http://itlab.mmcs.sfedu.ru/redmine/</a>
-</li>
-<li>Отправляем на почту Романа Борисовича <code>romanofficial@ya.ru</code> свой логин</li>
-<li>Ждём утверждения учётной записи</li>
-</ul>
-
-<h4 id="gitlab">
-<a id="user-content-gitlab" class="anchor" href="#gitlab" aria-hidden="true"><span class="octicon octicon-link"></span></a>Gitlab</h4>
-
-<ul>
-<li>Пишем <a href="https://twitter.com/ya_dummer">Артёму</a> <em>(email?)</em>
-</li>
-<li>Отправляем адрес электронной почты, логин, имя</li>
-<li>На почту придёт уведомление со ссылкой на последующую авторизацию</li>
-<li>Адрес: <a href="http://gitlab.mmcs.sfedu.ru/">http://gitlab.mmcs.sfedu.ru/</a>
-</li>
-</ul>
-
-<p>На данный момент на Gitlab'e не ведётся разработка, но можно будет туда переехать в скором времени, с появлением автоматического тестирования. Есть возможность создать 10 приватных репозиториев.</p>
-
-<h4 id="%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF-%D0%BA-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8E">
-<a id="user-content-Доступ-к-репозиторию" class="anchor" href="#%D0%94%D0%BE%D1%81%D1%82%D1%83%D0%BF-%D0%BA-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8E" aria-hidden="true"><span class="octicon octicon-link"></span></a>Доступ к репозиторию</h4>
-
-<p>Пара логин / пароль, используемая в redmine, также используется и при авторизации в репозитории.</p>
-
-<div class="highlight highlight-bash"><pre>$ git clone http://itlab.mmcs.sfedu.ru/git/<span class="pl-k">&lt;</span>project_name<span class="pl-k">&gt;</span></pre></div>
-
-<h2 id="%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%BF%D0%BE">
-<a id="user-content-Настройка-ПО" class="anchor" href="#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%9F%D0%9E" aria-hidden="true"><span class="octicon octicon-link"></span></a>Настройка ПО</h2>
-
-<p>Комплект ПО, с которым мы работаем на данный момент: </p>
-
-<ul>
-<li>
-<a href="https://www.jetbrains.com/phpstorm/download/">PHPStorm</a> (Community Edition) — профессиональная IDE, альтернатива: NetBeans</li>
-<li>
-<a href="http://rutracker.org/forum/viewtopic.php?t=4894492">OpenServer</a> (Расширенная редакция) — платформа, создающая виртуальное окружение для Apache, Nginx, MySQL Server</li>
-<li>
-<a href="http://git-scm.com/downloads">Git</a> — система контроля версий</li>
-<li>
-<a href="www.sourcetreeapp.com/download/">SourceTree</a> — гипер удобный GUI для git <em>(по мнению Штейнберга Р.Б.)</em>
-</li>
-</ul>
-
-<h4 id="%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B8-openserver">
-<a id="user-content-Настройки-openserver" class="anchor" href="#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B8-openserver" aria-hidden="true"><span class="octicon octicon-link"></span></a>Настройки OpenServer</h4>
-
-<p><strong>Вкладка основные</strong>: поставтье галку на пункте "Требовать учётную запись Администратора", так как OpenServer работает с файлом HOSTS.</p>
-
-<p><strong>Вкладка модули</strong>: Apache-2.4 + ngingx, PHP-5.5, MySQL-5.5.</p>
-
-<p>Откройте каталог <code>OpenServer/domains</code>, и <a href="#%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF-%D0%BA-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8E">склонируйте</a> репозиторий проекта в него. После перезапуска OpenServer'a по адресу подкаталога станет доступен сайт.</p>
-
-<h2 id="%D0%BA%D0%B0%D0%BA-%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-dev_rating">
-<a id="user-content-Как-поставить-dev_rating" class="anchor" href="#%D0%9A%D0%B0%D0%BA-%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-dev_rating" aria-hidden="true"><span class="octicon octicon-link"></span></a>Как поставить dev_rating?</h2>
-
-<ul>
-<li><p>Скачать проект в папку <code>OpenServer/domains</code> с помощью команды <code>git clone &lt;адрес репозитория&gt;</code></p></li>
-<li><p>Настроить адрес сайта в файлах:</p></li>
-</ul>
-
-<pre><code>./~dev_rating/htaccess
-./~dev_rating/application/bootstrap.php
-(line ~107: 'base_url' =&gt; '/~dev_rating/')
-</code></pre>
-
-<ul>
-<li>
-<p>Подготовить базу данных</p>
-
-<ul>
-<li>Зайти в phpMyAdmin. Правой кнопкой по иконке OpenServer'a     -&gt; <em>Дополнительно</em>     -&gt; <em>phpMyAdmin</em>. Стандартный логин <code>root</code>, пароль пустой.</li>
-<li>Создать базу данных</li>
-<li>Последовательно импортировать <code>db/Structure.sql</code>, <code>db/release_gen_mmcs_sg.sql</code>, <code>db/StoredProcedures.sql</code>, <code>db/StoredFunctions.sql</code>, <code>db/Views.sql</code>.</li>
-</ul>
-</li>
-<li><p>Скопировать конфигурационные файлы из <code>./~dev_rating/deployConfig</code> в <code>./~dev_rating/application/config/</code></p></li>
-<li><p>Настроить конфиг. Как минимум изменить <code>./~dev_rating/application/config/database.php</code> под свою базу.</p></li>
-</ul>
-</article></body></html>
\ No newline at end of file
diff --git a/doc/dev/installation.md b/doc/dev/installation.md
deleted file mode 100644
index 1e2bf00875c5efeaa88a953bdcafdaf3a534fcfd..0000000000000000000000000000000000000000
--- a/doc/dev/installation.md
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-## Настройка доступа
-
-#### Redmine
-
-- Регистрируемся на сайте http://itlab.mmcs.sfedu.ru/redmine/
-- Отправляем на почту Романа Борисовича `romanofficial@ya.ru` свой логин
-- Ждём утверждения учётной записи
-
-
-#### Gitlab
-
-- Пишем [Артёму](https://twitter.com/ya_dummer) _(email?)_
-- Отправляем адрес электронной почты, логин, имя
-- На почту придёт уведомление со ссылкой на последующую авторизацию
-- Адрес: http://gitlab.mmcs.sfedu.ru/
-
-На данный момент на Gitlab'e не ведётся разработка, но можно будет туда переехать в скором времени, с появлением автоматического тестирования. Есть возможность создать 10 приватных репозиториев.
-
-
-#### Доступ к репозиторию
-
-Пара логин / пароль, используемая в redmine, также используется и при авторизации в репозитории.
-
-```bash
-$ git clone http://itlab.mmcs.sfedu.ru/git/<project_name>
-```
-
-## Настройка ПО
-
-Комплект ПО, с которым мы работаем на данный момент: 
-- [PHPStorm](https://www.jetbrains.com/phpstorm/download/) (Community Edition) — профессиональная IDE, альтернатива: NetBeans
-- [OpenServer](http://rutracker.org/forum/viewtopic.php?t=4894492) (Расширенная редакция) — платформа, создающая виртуальное окружение для Apache, Nginx, MySQL Server
-- [Git](http://git-scm.com/downloads) — система контроля версий
-- [SourceTree](www.sourcetreeapp.com/download/) — гипер удобный GUI для git _(по мнению Штейнберга Р.Б.)_
-
-#### Настройки OpenServer
-
-**Вкладка основные**: поставтье галку на пункте "Требовать учётную запись Администратора", так как OpenServer работает с файлом HOSTS.
-
-**Вкладка модули**: Apache-2.4 + ngingx, PHP-5.5, MySQL-5.5.
-
-Откройте каталог `OpenServer/domains`, и [склонируйте](#%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF-%D0%BA-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8E) репозиторий проекта в него. После перезапуска OpenServer'a по адресу подкаталога станет доступен сайт.
-
-
-## Как поставить dev_rating?
-
-- Скачать проект в папку `OpenServer/domains` с помощью команды `git clone <адрес репозитория>`
-
-- Настроить адрес сайта в файлах:
-```
-./~dev_rating/htaccess
-./~dev_rating/application/bootstrap.php
-(line ~107: 'base_url' => '/~dev_rating/')
-```
-
-- Подготовить базу данных
-    * Зайти в phpMyAdmin. Правой кнопкой по иконке OpenServer'a     -> _Дополнительно_     -> _phpMyAdmin_. Стандартный логин `root`, пароль пустой.
-    * Создать базу данных
-    * Последовательно импортировать `db/Structure.sql`, `db/release_gen_mmcs_sg.sql`, `db/StoredProcedures.sql`, `db/StoredFunctions.sql`, `db/Views.sql`.
-
-- Скопировать конфигурационные файлы из `./~dev_rating/deployConfig` в `./~dev_rating/application/config/`
-
-- Настроить конфиг. Как минимум изменить `./~dev_rating/application/config/database.php` под свою базу.
\ No newline at end of file
diff --git a/doc/dev/testing/kohana/mockobjects.html b/doc/dev/testing/kohana/mockobjects.html
deleted file mode 100644
index df3e76526e80f5be8a11e91cbe673544c4a245b4..0000000000000000000000000000000000000000
--- a/doc/dev/testing/kohana/mockobjects.html
+++ /dev/null
@@ -1,1150 +0,0 @@
-<!DOCTYPE html><html><head><meta charset="utf-8"><style>body {
-  width: 45em;
-  border: 1px solid #ddd;
-  outline: 1300px solid #fff;
-  margin: 16px auto;
-}
-
-body .markdown-body
-{
-  padding: 30px;
-}
-
-@font-face {
-  font-family: octicons-anchor;
-  src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAYcAA0AAAAACjQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABMAAAABwAAAAca8vGTk9TLzIAAAFMAAAARAAAAFZG1VHVY21hcAAAAZAAAAA+AAABQgAP9AdjdnQgAAAB0AAAAAQAAAAEACICiGdhc3AAAAHUAAAACAAAAAj//wADZ2x5ZgAAAdwAAADRAAABEKyikaNoZWFkAAACsAAAAC0AAAA2AtXoA2hoZWEAAALgAAAAHAAAACQHngNFaG10eAAAAvwAAAAQAAAAEAwAACJsb2NhAAADDAAAAAoAAAAKALIAVG1heHAAAAMYAAAAHwAAACABEAB2bmFtZQAAAzgAAALBAAAFu3I9x/Nwb3N0AAAF/AAAAB0AAAAvaoFvbwAAAAEAAAAAzBdyYwAAAADP2IQvAAAAAM/bz7t4nGNgZGFgnMDAysDB1Ml0hoGBoR9CM75mMGLkYGBgYmBlZsAKAtJcUxgcPsR8iGF2+O/AEMPsznAYKMwIkgMA5REMOXicY2BgYGaAYBkGRgYQsAHyGMF8FgYFIM0ChED+h5j//yEk/3KoSgZGNgYYk4GRCUgwMaACRoZhDwCs7QgGAAAAIgKIAAAAAf//AAJ4nHWMMQrCQBBF/0zWrCCIKUQsTDCL2EXMohYGSSmorScInsRGL2DOYJe0Ntp7BK+gJ1BxF1stZvjz/v8DRghQzEc4kIgKwiAppcA9LtzKLSkdNhKFY3HF4lK69ExKslx7Xa+vPRVS43G98vG1DnkDMIBUgFN0MDXflU8tbaZOUkXUH0+U27RoRpOIyCKjbMCVejwypzJJG4jIwb43rfl6wbwanocrJm9XFYfskuVC5K/TPyczNU7b84CXcbxks1Un6H6tLH9vf2LRnn8Ax7A5WQAAAHicY2BkYGAA4teL1+yI57f5ysDNwgAC529f0kOmWRiYVgEpDgYmEA8AUzEKsQAAAHicY2BkYGB2+O/AEMPCAAJAkpEBFbAAADgKAe0EAAAiAAAAAAQAAAAEAAAAAAAAKgAqACoAiAAAeJxjYGRgYGBhsGFgYgABEMkFhAwM/xn0QAIAD6YBhwB4nI1Ty07cMBS9QwKlQapQW3VXySvEqDCZGbGaHULiIQ1FKgjWMxknMfLEke2A+IJu+wntrt/QbVf9gG75jK577Lg8K1qQPCfnnnt8fX1NRC/pmjrk/zprC+8D7tBy9DHgBXoWfQ44Av8t4Bj4Z8CLtBL9CniJluPXASf0Lm4CXqFX8Q84dOLnMB17N4c7tBo1AS/Qi+hTwBH4rwHHwN8DXqQ30XXAS7QaLwSc0Gn8NuAVWou/gFmnjLrEaEh9GmDdDGgL3B4JsrRPDU2hTOiMSuJUIdKQQayiAth69r6akSSFqIJuA19TrzCIaY8sIoxyrNIrL//pw7A2iMygkX5vDj+G+kuoLdX4GlGK/8Lnlz6/h9MpmoO9rafrz7ILXEHHaAx95s9lsI7AHNMBWEZHULnfAXwG9/ZqdzLI08iuwRloXE8kfhXYAvE23+23DU3t626rbs8/8adv+9DWknsHp3E17oCf+Z48rvEQNZ78paYM38qfk3v/u3l3u3GXN2Dmvmvpf1Srwk3pB/VSsp512bA/GG5i2WJ7wu430yQ5K3nFGiOqgtmSB5pJVSizwaacmUZzZhXLlZTq8qGGFY2YcSkqbth6aW1tRmlaCFs2016m5qn36SbJrqosG4uMV4aP2PHBmB3tjtmgN2izkGQyLWprekbIntJFing32a5rKWCN/SdSoga45EJykyQ7asZvHQ8PTm6cslIpwyeyjbVltNikc2HTR7YKh9LBl9DADC0U/jLcBZDKrMhUBfQBvXRzLtFtjU9eNHKin0x5InTqb8lNpfKv1s1xHzTXRqgKzek/mb7nB8RZTCDhGEX3kK/8Q75AmUM/eLkfA+0Hi908Kx4eNsMgudg5GLdRD7a84npi+YxNr5i5KIbW5izXas7cHXIMAau1OueZhfj+cOcP3P8MNIWLyYOBuxL6DRylJ4cAAAB4nGNgYoAALjDJyIAOWMCiTIxMLDmZedkABtIBygAAAA==) format('woff');
-}
-
-.markdown-body {
-  -ms-text-size-adjust: 100%;
-  -webkit-text-size-adjust: 100%;
-  color: #333;
-  overflow: hidden;
-  font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif;
-  font-size: 16px;
-  line-height: 1.6;
-  word-wrap: break-word;
-}
-
-.markdown-body a {
-  background: transparent;
-}
-
-.markdown-body a:active,
-.markdown-body a:hover {
-  outline: 0;
-}
-
-.markdown-body strong {
-  font-weight: bold;
-}
-
-.markdown-body h1 {
-  font-size: 2em;
-  margin: 0.67em 0;
-}
-
-.markdown-body img {
-  border: 0;
-}
-
-.markdown-body hr {
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-  height: 0;
-}
-
-.markdown-body pre {
-  overflow: auto;
-}
-
-.markdown-body code,
-.markdown-body kbd,
-.markdown-body pre {
-  font-family: monospace, monospace;
-  font-size: 1em;
-}
-
-.markdown-body input {
-  color: inherit;
-  font: inherit;
-  margin: 0;
-}
-
-.markdown-body html input[disabled] {
-  cursor: default;
-}
-
-.markdown-body input {
-  line-height: normal;
-}
-
-.markdown-body input[type="checkbox"] {
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  padding: 0;
-}
-
-.markdown-body table {
-  border-collapse: collapse;
-  border-spacing: 0;
-}
-
-.markdown-body td,
-.markdown-body th {
-  padding: 0;
-}
-
-.markdown-body * {
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-
-.markdown-body input {
-  font: 13px/1.4 Helvetica, arial, freesans, clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol";
-}
-
-.markdown-body a {
-  color: #4183c4;
-  text-decoration: none;
-}
-
-.markdown-body a:hover,
-.markdown-body a:focus,
-.markdown-body a:active {
-  text-decoration: underline;
-}
-
-.markdown-body hr {
-  height: 0;
-  margin: 15px 0;
-  overflow: hidden;
-  background: transparent;
-  border: 0;
-  border-bottom: 1px solid #ddd;
-}
-
-.markdown-body hr:before {
-  display: table;
-  content: "";
-}
-
-.markdown-body hr:after {
-  display: table;
-  clear: both;
-  content: "";
-}
-
-.markdown-body h1,
-.markdown-body h2,
-.markdown-body h3,
-.markdown-body h4,
-.markdown-body h5,
-.markdown-body h6 {
-  margin-top: 15px;
-  margin-bottom: 15px;
-  line-height: 1.1;
-}
-
-.markdown-body h1 {
-  font-size: 30px;
-}
-
-.markdown-body h2 {
-  font-size: 21px;
-}
-
-.markdown-body h3 {
-  font-size: 16px;
-}
-
-.markdown-body h4 {
-  font-size: 14px;
-}
-
-.markdown-body h5 {
-  font-size: 12px;
-}
-
-.markdown-body h6 {
-  font-size: 11px;
-}
-
-.markdown-body blockquote {
-  margin: 0;
-}
-
-.markdown-body ul,
-.markdown-body ol {
-  padding: 0;
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-.markdown-body ol ol,
-.markdown-body ul ol {
-  list-style-type: lower-roman;
-}
-
-.markdown-body ul ul ol,
-.markdown-body ul ol ol,
-.markdown-body ol ul ol,
-.markdown-body ol ol ol {
-  list-style-type: lower-alpha;
-}
-
-.markdown-body dd {
-  margin-left: 0;
-}
-
-.markdown-body code {
-  font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace;
-}
-
-.markdown-body pre {
-  margin-top: 0;
-  margin-bottom: 0;
-  font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace;
-}
-
-.markdown-body .octicon {
-  font: normal normal 16px octicons-anchor;
-  line-height: 1;
-  display: inline-block;
-  text-decoration: none;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-
-.markdown-body .octicon-link:before {
-  content: '\f05c';
-}
-
-.markdown-body>*:first-child {
-  margin-top: 0 !important;
-}
-
-.markdown-body>*:last-child {
-  margin-bottom: 0 !important;
-}
-
-.markdown-body .anchor {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  display: block;
-  padding-right: 6px;
-  padding-left: 30px;
-  margin-left: -30px;
-}
-
-.markdown-body .anchor:focus {
-  outline: none;
-}
-
-.markdown-body h1,
-.markdown-body h2,
-.markdown-body h3,
-.markdown-body h4,
-.markdown-body h5,
-.markdown-body h6 {
-  position: relative;
-  margin-top: 1em;
-  margin-bottom: 16px;
-  font-weight: bold;
-  line-height: 1.4;
-}
-
-.markdown-body h1 .octicon-link,
-.markdown-body h2 .octicon-link,
-.markdown-body h3 .octicon-link,
-.markdown-body h4 .octicon-link,
-.markdown-body h5 .octicon-link,
-.markdown-body h6 .octicon-link {
-  display: none;
-  color: #000;
-  vertical-align: middle;
-}
-
-.markdown-body h1:hover .anchor,
-.markdown-body h2:hover .anchor,
-.markdown-body h3:hover .anchor,
-.markdown-body h4:hover .anchor,
-.markdown-body h5:hover .anchor,
-.markdown-body h6:hover .anchor {
-  padding-left: 8px;
-  margin-left: -30px;
-  line-height: 1;
-  text-decoration: none;
-}
-
-.markdown-body h1:hover .anchor .octicon-link,
-.markdown-body h2:hover .anchor .octicon-link,
-.markdown-body h3:hover .anchor .octicon-link,
-.markdown-body h4:hover .anchor .octicon-link,
-.markdown-body h5:hover .anchor .octicon-link,
-.markdown-body h6:hover .anchor .octicon-link {
-  display: inline-block;
-}
-
-.markdown-body h1 {
-  padding-bottom: 0.3em;
-  font-size: 2.25em;
-  line-height: 1.2;
-  border-bottom: 1px solid #eee;
-}
-
-.markdown-body h2 {
-  padding-bottom: 0.3em;
-  font-size: 1.75em;
-  line-height: 1.225;
-  border-bottom: 1px solid #eee;
-}
-
-.markdown-body h3 {
-  font-size: 1.5em;
-  line-height: 1.43;
-}
-
-.markdown-body h4 {
-  font-size: 1.25em;
-}
-
-.markdown-body h5 {
-  font-size: 1em;
-}
-
-.markdown-body h6 {
-  font-size: 1em;
-  color: #777;
-}
-
-.markdown-body p,
-.markdown-body blockquote,
-.markdown-body ul,
-.markdown-body ol,
-.markdown-body dl,
-.markdown-body table,
-.markdown-body pre {
-  margin-top: 0;
-  margin-bottom: 16px;
-}
-
-.markdown-body hr {
-  height: 4px;
-  padding: 0;
-  margin: 16px 0;
-  background-color: #e7e7e7;
-  border: 0 none;
-}
-
-.markdown-body ul,
-.markdown-body ol {
-  padding-left: 2em;
-}
-
-.markdown-body ul ul,
-.markdown-body ul ol,
-.markdown-body ol ol,
-.markdown-body ol ul {
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-.markdown-body li>p {
-  margin-top: 16px;
-}
-
-.markdown-body dl {
-  padding: 0;
-}
-
-.markdown-body dl dt {
-  padding: 0;
-  margin-top: 16px;
-  font-size: 1em;
-  font-style: italic;
-  font-weight: bold;
-}
-
-.markdown-body dl dd {
-  padding: 0 16px;
-  margin-bottom: 16px;
-}
-
-.markdown-body blockquote {
-  padding: 0 15px;
-  color: #777;
-  border-left: 4px solid #ddd;
-}
-
-.markdown-body blockquote>:first-child {
-  margin-top: 0;
-}
-
-.markdown-body blockquote>:last-child {
-  margin-bottom: 0;
-}
-
-.markdown-body table {
-  display: block;
-  width: 100%;
-  overflow: auto;
-  word-break: normal;
-  word-break: keep-all;
-}
-
-.markdown-body table th {
-  font-weight: bold;
-}
-
-.markdown-body table th,
-.markdown-body table td {
-  padding: 6px 13px;
-  border: 1px solid #ddd;
-}
-
-.markdown-body table tr {
-  background-color: #fff;
-  border-top: 1px solid #ccc;
-}
-
-.markdown-body table tr:nth-child(2n) {
-  background-color: #f8f8f8;
-}
-
-.markdown-body img {
-  max-width: 100%;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-
-.markdown-body code {
-  padding: 0;
-  padding-top: 0.2em;
-  padding-bottom: 0.2em;
-  margin: 0;
-  font-size: 85%;
-  background-color: rgba(0,0,0,0.04);
-  border-radius: 3px;
-}
-
-.markdown-body code:before,
-.markdown-body code:after {
-  letter-spacing: -0.2em;
-  content: "\00a0";
-}
-
-.markdown-body pre>code {
-  padding: 0;
-  margin: 0;
-  font-size: 100%;
-  word-break: normal;
-  white-space: pre;
-  background: transparent;
-  border: 0;
-}
-
-.markdown-body .highlight {
-  margin-bottom: 16px;
-}
-
-.markdown-body .highlight pre,
-.markdown-body pre {
-  padding: 16px;
-  overflow: auto;
-  font-size: 85%;
-  line-height: 1.45;
-  background-color: #f7f7f7;
-  border-radius: 3px;
-}
-
-.markdown-body .highlight pre {
-  margin-bottom: 0;
-  word-break: normal;
-}
-
-.markdown-body pre {
-  word-wrap: normal;
-}
-
-.markdown-body pre code {
-  display: inline;
-  max-width: initial;
-  padding: 0;
-  margin: 0;
-  overflow: initial;
-  line-height: inherit;
-  word-wrap: normal;
-  background-color: transparent;
-  border: 0;
-}
-
-.markdown-body pre code:before,
-.markdown-body pre code:after {
-  content: normal;
-}
-
-.markdown-body .highlight {
-  background: #fff;
-}
-
-.markdown-body .highlight .h {
-  color: #333;
-  font-style: normal;
-  font-weight: normal;
-}
-
-.markdown-body .highlight .mf,
-.markdown-body .highlight .mh,
-.markdown-body .highlight .mi,
-.markdown-body .highlight .mo,
-.markdown-body .highlight .il,
-.markdown-body .highlight .m {
-  color: #945277;
-}
-
-.markdown-body .highlight .s,
-.markdown-body .highlight .sb,
-.markdown-body .highlight .sc,
-.markdown-body .highlight .sd,
-.markdown-body .highlight .s2,
-.markdown-body .highlight .se,
-.markdown-body .highlight .sh,
-.markdown-body .highlight .si,
-.markdown-body .highlight .sx,
-.markdown-body .highlight .s1 {
-  color: #df5000;
-}
-
-.markdown-body .highlight .kc,
-.markdown-body .highlight .kd,
-.markdown-body .highlight .kn,
-.markdown-body .highlight .kp,
-.markdown-body .highlight .kr,
-.markdown-body .highlight .kt,
-.markdown-body .highlight .k,
-.markdown-body .highlight .o {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .kt {
-  color: #458;
-}
-
-.markdown-body .highlight .c,
-.markdown-body .highlight .cm,
-.markdown-body .highlight .c1 {
-  color: #998;
-  font-style: italic;
-}
-
-.markdown-body .highlight .cp,
-.markdown-body .highlight .cs,
-.markdown-body .highlight .cp .h {
-  color: #999;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .cs {
-  font-style: italic;
-}
-
-.markdown-body .highlight .n {
-  color: #333;
-}
-
-.markdown-body .highlight .na,
-.markdown-body .highlight .nv,
-.markdown-body .highlight .vc,
-.markdown-body .highlight .vg,
-.markdown-body .highlight .vi {
-  color: #008080;
-}
-
-.markdown-body .highlight .nb {
-  color: #0086B3;
-}
-
-.markdown-body .highlight .nc {
-  color: #458;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .no {
-  color: #094e99;
-}
-
-.markdown-body .highlight .ni {
-  color: #800080;
-}
-
-.markdown-body .highlight .ne {
-  color: #990000;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .nf {
-  color: #945277;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .nn {
-  color: #555;
-}
-
-.markdown-body .highlight .nt {
-  color: #000080;
-}
-
-.markdown-body .highlight .err {
-  color: #a61717;
-  background-color: #e3d2d2;
-}
-
-.markdown-body .highlight .gd {
-  color: #000;
-  background-color: #fdd;
-}
-
-.markdown-body .highlight .gd .x {
-  color: #000;
-  background-color: #faa;
-}
-
-.markdown-body .highlight .ge {
-  font-style: italic;
-}
-
-.markdown-body .highlight .gr {
-  color: #aa0000;
-}
-
-.markdown-body .highlight .gh {
-  color: #999;
-}
-
-.markdown-body .highlight .gi {
-  color: #000;
-  background-color: #dfd;
-}
-
-.markdown-body .highlight .gi .x {
-  color: #000;
-  background-color: #afa;
-}
-
-.markdown-body .highlight .go {
-  color: #888;
-}
-
-.markdown-body .highlight .gp {
-  color: #555;
-}
-
-.markdown-body .highlight .gs {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .gu {
-  color: #800080;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .gt {
-  color: #aa0000;
-}
-
-.markdown-body .highlight .ow {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .w {
-  color: #bbb;
-}
-
-.markdown-body .highlight .sr {
-  color: #017936;
-}
-
-.markdown-body .highlight .ss {
-  color: #8b467f;
-}
-
-.markdown-body .highlight .bp {
-  color: #999;
-}
-
-.markdown-body .highlight .gc {
-  color: #999;
-  background-color: #EAF2F5;
-}
-
-.markdown-body kbd {
-  background-color: #e7e7e7;
-  background-image: -webkit-linear-gradient(#fefefe, #e7e7e7);
-  background-image: linear-gradient(#fefefe, #e7e7e7);
-  background-repeat: repeat-x;
-  display: inline-block;
-  padding: 3px 5px;
-  font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace;
-  line-height: 10px;
-  color: #000;
-  border: 1px solid #cfcfcf;
-  border-radius: 2px;
-}
-
-.markdown-body .highlight .pl-coc,
-.markdown-body .highlight .pl-entm,
-.markdown-body .highlight .pl-eoa,
-.markdown-body .highlight .pl-mai .pl-sf,
-.markdown-body .highlight .pl-pdv,
-.markdown-body .highlight .pl-sc,
-.markdown-body .highlight .pl-sr,
-.markdown-body .highlight .pl-v,
-.markdown-body .highlight .pl-vpf {
-  color: #0086b3;
-}
-
-.markdown-body .highlight .pl-eoac,
-.markdown-body .highlight .pl-mdht,
-.markdown-body .highlight .pl-mi1,
-.markdown-body .highlight .pl-mri,
-.markdown-body .highlight .pl-va,
-.markdown-body .highlight .pl-vpu {
-  color: #008080;
-}
-
-.markdown-body .highlight .pl-c,
-.markdown-body .highlight .pl-pdc {
-  color: #b4b7b4;
-  font-style: italic;
-}
-
-.markdown-body .highlight .pl-k,
-.markdown-body .highlight .pl-ko,
-.markdown-body .highlight .pl-kolp,
-.markdown-body .highlight .pl-mc,
-.markdown-body .highlight .pl-mr,
-.markdown-body .highlight .pl-ms,
-.markdown-body .highlight .pl-s,
-.markdown-body .highlight .pl-sok,
-.markdown-body .highlight .pl-st {
-  color: #6e5494;
-}
-
-.markdown-body .highlight .pl-ef,
-.markdown-body .highlight .pl-enf,
-.markdown-body .highlight .pl-enm,
-.markdown-body .highlight .pl-entc,
-.markdown-body .highlight .pl-eoi,
-.markdown-body .highlight .pl-sf,
-.markdown-body .highlight .pl-smc {
-  color: #d12089;
-}
-
-.markdown-body .highlight .pl-ens,
-.markdown-body .highlight .pl-eoai,
-.markdown-body .highlight .pl-kos,
-.markdown-body .highlight .pl-mh .pl-pdh,
-.markdown-body .highlight .pl-mp,
-.markdown-body .highlight .pl-pde,
-.markdown-body .highlight .pl-stp {
-  color: #458;
-}
-
-.markdown-body .highlight .pl-enti {
-  color: #d12089;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-cce,
-.markdown-body .highlight .pl-enc,
-.markdown-body .highlight .pl-kou,
-.markdown-body .highlight .pl-mq {
-  color: #f93;
-}
-
-.markdown-body .highlight .pl-mp1 .pl-sf {
-  color: #458;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-cos,
-.markdown-body .highlight .pl-ent,
-.markdown-body .highlight .pl-md,
-.markdown-body .highlight .pl-mdhf,
-.markdown-body .highlight .pl-ml,
-.markdown-body .highlight .pl-pdc1,
-.markdown-body .highlight .pl-pds,
-.markdown-body .highlight .pl-s1,
-.markdown-body .highlight .pl-scp,
-.markdown-body .highlight .pl-sol {
-  color: #df5000;
-}
-
-.markdown-body .highlight .pl-c1,
-.markdown-body .highlight .pl-cn,
-.markdown-body .highlight .pl-pse,
-.markdown-body .highlight .pl-pse .pl-s2,
-.markdown-body .highlight .pl-vi {
-  color: #a31515;
-}
-
-.markdown-body .highlight .pl-mb,
-.markdown-body .highlight .pl-pdb {
-  color: #df5000;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-mi,
-.markdown-body .highlight .pl-pdi {
-  color: #6e5494;
-  font-style: italic;
-}
-
-.markdown-body .highlight .pl-ms1 {
-  background-color: #f5f5f5;
-}
-
-.markdown-body .highlight .pl-mdh,
-.markdown-body .highlight .pl-mdi {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-mdr {
-  color: #0086b3;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-s2 {
-  color: #333;
-}
-
-.markdown-body .highlight .pl-ii {
-  background-color: #df5000;
-  color: #fff;
-}
-
-.markdown-body .highlight .pl-ib {
-  background-color: #f93;
-}
-
-.markdown-body .highlight .pl-id {
-  background-color: #a31515;
-  color: #fff;
-}
-
-.markdown-body .highlight .pl-iu {
-  background-color: #b4b7b4;
-}
-
-.markdown-body .highlight .pl-mo {
-  color: #969896;
-}
-
-.markdown-body .task-list-item {
-  list-style-type: none;
-}
-
-.markdown-body .task-list-item+.task-list-item {
-  margin-top: 3px;
-}
-
-.markdown-body .task-list-item input {
-  float: left;
-  margin: 0.3em 0 0.25em -1.6em;
-  vertical-align: middle;
-}</style><title>mockobjects</title></head><body><article class="markdown-body"><h1 id="mock-objects">
-<a id="user-content-mock-objects" class="anchor" href="#mock-objects" aria-hidden="true"><span class="octicon octicon-link"></span></a>Mock objects</h1>
-
-<p>Sometimes when writing tests you need to test something that depends on an object being in a certain state.</p>
-
-<p>Say for example you're testing a model - you want to make sure that the model is running the correct query, but you don't want it to run on a real database server.  You can create a mock database connection which responds in the way the model expects, but doesn't actually connect to a physical database.</p>
-
-<p>PHPUnit has a built in mock object creator which can generate mocks for classes (inc. abstract ones) on the fly.<br>
-It creates a class that extends the one you want to mock.  You can also tell PHPUnit to override certain functions to return set values / assert that they're called in a specific way.</p>
-
-<h2 id="creating-an-instance-of-a-mock-class">
-<a id="user-content-creating-an-instance-of-a-mock-class" class="anchor" href="#creating-an-instance-of-a-mock-class" aria-hidden="true"><span class="octicon octicon-link"></span></a>Creating an instance of a mock class</h2>
-
-<p>You create mocks from within testcases using the getMock() function, which is defined in <code>PHPUnit_Framework_TestCase</code> like so:</p>
-
-<pre><code>    getMock($originalClassName, $methods = array(), array $arguments = array(), $mockClassName = '', $callOriginalConstructor = TRUE, $callOriginalClone = TRUE, $callAutoload = TRUE)
-</code></pre>
-
-<p><code>$originalClassName</code>
-: The name of the class that you want to mock</p>
-
-<p><code>$methods</code>
-: The methods of $originalClassName that you want to mock.<br>
-  You need to tell PHPUnit in advance because PHP doesn't allow you to extend an object once it's been initialised.</p>
-
-<p><code>$arguments</code>
-: An array of arguments to pass to the mock's constructor</p>
-
-<p><code>$mockClassName</code>
-: Allows you to specify the name that will be given to the mock</p>
-
-<p><code>$callOriginalConstructor</code>
-: Should the mock call its parent's constructor automatically?</p>
-
-<p><code>$callOriginalClone</code>
-: Should the mock call its parent's clone method?</p>
-
-<p>Most of the time you'll only need to use the first two parameters, i.e.:</p>
-
-<pre><code>$mock = $this-&gt;getMock('ORM');
-</code></pre>
-
-<p><code>$mock</code> now contains a mock of ORM and can be handled as though it were a vanilla instance of <code>ORM</code></p>
-
-<pre><code>$mock = $this-&gt;getMock('ORM', array('check'));
-</code></pre>
-
-<p><code>$mock</code> now contains a mock of ORM, but this time we're also mocking the check() method.</p>
-
-<h2 id="mocking-methods">
-<a id="user-content-mocking-methods" class="anchor" href="#mocking-methods" aria-hidden="true"><span class="octicon octicon-link"></span></a>Mocking methods</h2>
-
-<p>Assuming we've created a mock object like so:</p>
-
-<pre><code>$mock = $this-&gt;getMock('ORM', array('check'));
-</code></pre>
-
-<p>We now need to tell PHPUnit how to mock the check function when its called.</p>
-
-<h3 id="how-many-times-should-it-be-called">
-<a id="user-content-how-many-times-should-it-be-called" class="anchor" href="#how-many-times-should-it-be-called" aria-hidden="true"><span class="octicon octicon-link"></span></a>How many times should it be called?</h3>
-
-<p>You start off by telling PHPUnit how many times the method should be called by calling expects() on the mock object:</p>
-
-<pre><code>$mock-&gt;expects($matcher);
-</code></pre>
-
-<p><code>expects()</code> takes one argument, an invoker matcher which you can create using factory methods defined in <code>PHPUnit_Framework_TestCase</code>:</p>
-
-<h4 id="possible-invoker-matchers">
-<a id="user-content-possible-invoker-matchers" class="anchor" href="#possible-invoker-matchers" aria-hidden="true"><span class="octicon octicon-link"></span></a>Possible invoker matchers:</h4>
-
-<p><code>$this-&gt;any()</code>
-: Returns a matcher that allows the method to be called any number of times</p>
-
-<p><code>$this-&gt;never()</code>
-: Returns a matcher that asserts that the method is never called</p>
-
-<p><code>$this-&gt;once()</code>
-: Returns a matcher that asserts that the method is only called once</p>
-
-<p><code>$this-&gt;atLeastOnce()</code>
-: Returns a matcher that asserts that the method is called at least once</p>
-
-<p><code>$this-&gt;exactly($count)</code>
-: Returns a matcher that asserts that the method is called at least <code>$count</code> times</p>
-
-<p><code>$this-&gt;at($index)</code>
-: Returns a matcher that matches when the method it is evaluated for is invoked at the given $index.</p>
-
-<p>In our example we want <code>check()</code> to be called once on our mock object, so if we update it accordingly:</p>
-
-<pre><code>$mock = $this-&gt;getMock('ORM', array('check'));
-
-$mock-&gt;expects($this-&gt;once());
-</code></pre>
-
-<h3 id="what-is-the-method-were-mocking">
-<a id="user-content-what-is-the-method-were-mocking" class="anchor" href="#what-is-the-method-were-mocking" aria-hidden="true"><span class="octicon octicon-link"></span></a>What is the method we're mocking?</h3>
-
-<p>Although we told PHPUnit what methods we want to mock, we haven't actually told it what method these rules we're specifiying apply to.<br>
-You do this by calling <code>method()</code> on the returned from <code>expects()</code>:</p>
-
-<pre><code>$mock-&gt;expects($matcher)
-    -&gt;method($methodName);
-</code></pre>
-
-<p>As you can probably guess, <code>method()</code> takes one parameter, the name of the method you're mocking.<br>
-There's nothing very fancy about this function.</p>
-
-<pre><code>$mock = $this-&gt;GetMock('ORM', array('check'));
-
-$mock-&gt;expects($this-&gt;once())
-    -&gt;method('check');
-</code></pre>
-
-<h3 id="what-parameters-should-our-mock-method-expect">
-<a id="user-content-what-parameters-should-our-mock-method-expect" class="anchor" href="#what-parameters-should-our-mock-method-expect" aria-hidden="true"><span class="octicon octicon-link"></span></a>What parameters should our mock method expect?</h3>
-
-<p>There are two ways to do this, either</p>
-
-<ul>
-<li>Tell the method to accept any parameters</li>
-<li>Tell the method to accept a specific set of parameters</li>
-</ul>
-
-<p>The former can be achieved by calling <code>withAnyParameters()</code> on the object returned from <code>method()</code></p>
-
-<pre><code>$mock-&gt;expects($matcher)
-    -&gt;method($methodName)
-    -&gt;withAnyParameters();
-</code></pre>
-
-<p>To only allow specific parameters you can use the <code>with()</code> method which accepts any number of parameters.<br>
-The order in which you define the parameters is the order that it expects them to be in when called.</p>
-
-<pre><code>$mock-&gt;expects($matcher)
-    -&gt;method($methodName)
-    -&gt;with($param1, $param2);
-</code></pre>
-
-<p>Calling <code>with()</code> without any parameters will force the mock method to accept no parameters.</p>
-
-<p>PHPUnit has a fairly complex way of comparing parameters passed to the mock method with the expected values, which can be summarised like so - </p>
-
-<ul>
-<li>If the values are identical, they are equal</li>
-<li>If the values are of different types they are not equal</li>
-<li>If the values are numbers they they are considered equal if their difference is equal to zero (this level of accuracy can be changed)</li>
-<li>If the values are objects then they are converted to arrays and are compared as arrays</li>
-<li>If the values are arrays then any sub-arrays deeper than x levels (default 10) are ignored in the comparision</li>
-<li>If the values are arrays and one contains more than elements that the other (at any depth up to the max depth), then they are not equal</li>
-</ul>
-
-<h4 id="more-advanced-parameter-comparisions">
-<a id="user-content-more-advanced-parameter-comparisions" class="anchor" href="#more-advanced-parameter-comparisions" aria-hidden="true"><span class="octicon octicon-link"></span></a>More advanced parameter comparisions</h4>
-
-<p>Sometimes you need to be more specific about how PHPUnit should compare parameters, i.e. if you want to make sure that one of the parameters is an instance of an object, yet isn't necessarily identical to a particular instance.</p>
-
-<p>In PHPUnit, the logic for validating objects and datatypes has been refactored into "constraint objects".  If you look in any of the assertX() methods you can see that they are nothing more than wrappers for associating constraint objects with tests.</p>
-
-<p>If a parameter passed to <code>with()</code> is not an instance of a constraint object (one which extends <code>PHPUnit_Framework_Constraint</code>) then PHPUnit creates a new <code>IsEqual</code> comparision object for it.</p>
-
-<p>i.e., the following methods produce the same result:</p>
-
-<pre><code>-&gt;with('foo', 1);
-
--&gt;with($this-&gt;equalTo('foo'), $this-&gt;equalTo(1));
-</code></pre>
-
-<p>Here are some of the wrappers PHPUnit provides for creating constraint objects:</p>
-
-<p><code>$this-&gt;arrayHasKey($key)</code>
-: Asserts that the parameter will have an element with index <code>$key</code></p>
-
-<p><code>$this-&gt;attribute(PHPUnit_Framework_Constraint $constraint, $attributeName)</code>
-: Asserts that object attribute <code>$attributeName</code> of the parameter will satisfy <code>$constraint</code>, where constraint is an instance of a constraint (i.e. <code>$this-&gt;equalTo()</code>)</p>
-
-<p><code>$this-&gt;fileExists()</code>
-: Accepts no parameters, asserts that the parameter is a path to a valid file (i.e. <code>file_exists() === TRUE</code>)</p>
-
-<p><code>$this-&gt;greaterThan($value)</code>
-: Asserts that the parameter is greater than <code>$value</code></p>
-
-<p><code>$this-&gt;anything()</code>
-: Returns TRUE regardless of what the parameter is</p>
-
-<p><code>$this-&gt;equalTo($value, $delta = 0, $canonicalizeEOL = FALSE, $ignoreCase = False)</code>
-: Asserts that the parameter is equal to <code>$value</code> (same as not passing a constraint object to <code>with()</code>)
-: <code>$delta</code> is the degree of accuracy to use when comparing numbers. i.e. 0 means numbers need to be identical, 1 means numbers can be within a distance of one from each other
-: If <code>$canonicalizeEOL</code> is TRUE then all newlines in string values will be converted to <code>\n</code> before comparision
-: If <code>$ignoreCase</code> is TRUE then both strings will be converted to lowercase before comparision</p>
-
-<p><code>$this-&gt;identicalTo($value)</code>
-: Asserts that the parameter is identical to <code>$value</code></p>
-
-<p><code>$this-&gt;isType($type)</code>
-: Asserts that the parameter is of type <code>$type</code>, where <code>$type</code> is a string representation of the core PHP data types</p>
-
-<p><code>$this-&gt;isInstanceOf($className)</code>
-: Asserts that the parameter is an instance of <code>$className</code></p>
-
-<p><code>$this-&gt;lessThan($value)</code>
-: Asserts that the parameter is less than <code>$value</code></p>
-
-<p><code>$this-&gt;objectHasAttribute($attribute)</code>
-: Asserts that the paramater (which is assumed to be an object) has an attribute <code>$attribute</code></p>
-
-<p><code>$this-&gt;matchesRegularExpression($pattern)</code>
-: Asserts that the parameter matches the PCRE pattern <code>$pattern</code> (using <code>preg_match()</code>)</p>
-
-<p><code>$this-&gt;stringContains($string, $ignoreCase = FALSE)</code>
-: Asserts that the parameter contains the string <code>$string</code>.  If <code>$ignoreCase</code> is TRUE then a case insensitive comparision is done</p>
-
-<p><code>$this-&gt;stringEndsWith($suffix)</code>
-: Asserts that the parameter ends with <code>$suffix</code> (assumes parameter is a string)</p>
-
-<p><code>$this-&gt;stringStartsWith($prefix)</code>
-: Asserts that the parameter starts with <code>$prefix</code> (assumes parameter is a string)</p>
-
-<p><code>$this-&gt;contains($value)</code>
-: Asserts that the parameter contains at least one value that is identical to <code>$value</code> (assumes parameter is array or <code>SplObjectStorage</code>)</p>
-
-<p><code>$this-&gt;containsOnly($type, $isNativeType = TRUE)</code>
-: Asserts that the parameter only contains items of type <code>$type</code>. <code>$isNativeType</code> should be set to TRUE when <code>$type</code> refers to a built in PHP data type (i.e. int, string etc.) (assumes parameter is array)</p>
-
-<p>There are more constraint objects than listed here, look in <code>PHPUnit_Framework_Assert</code> and <code>PHPUnit/Framework/Constraint</code> if you need more constraints.</p>
-
-<p>If we continue our example, we have the following:  </p>
-
-<pre><code>$mock-&gt;expects($this-&gt;once())
-    -&gt;method('check')
-    -&gt;with();
-</code></pre>
-
-<p>So far PHPUnit knows that we want the <code>check()</code> method to be called once, with no parameters.  Now we just need to get it to return something...</p>
-
-<h3 id="what-should-the-method-return">
-<a id="user-content-what-should-the-method-return" class="anchor" href="#what-should-the-method-return" aria-hidden="true"><span class="octicon octicon-link"></span></a>What should the method return?</h3>
-
-<p>This is the final stage of mocking a method.</p>
-
-<p>By default PHPUnit can return either</p>
-
-<ul>
-<li>A fixed value</li>
-<li>One of the parameters that were passed to it</li>
-<li>The return value of a specified callback</li>
-</ul>
-
-<p>Specifying a return value is easy, just call <code>will()</code> on the object returned by either <code>method()</code> or <code>with()</code>.</p>
-
-<p>The function is defined like so:</p>
-
-<pre><code>public function will(PHPUnit_Framework_MockObject_Stub $stub)
-</code></pre>
-
-<p>PHPUnit provides some MockObject stubs out of the box, you can access them via (when called from a testcase):</p>
-
-<p><code>$this-&gt;returnValue($value)</code>
-: Returns <code>$value</code> when the mocked method is called</p>
-
-<p><code>$this-&gt;returnArgument($argumentIndex)</code>
-: Returns the <code>$argumentIndex</code>th argument that was passed to the mocked method</p>
-
-<p><code>$this-&gt;returnCallback($callback)</code>
-: Returns the value of the callback, useful for more complicated mocking.<br>
-: <code>$callback</code> should a valid callback (i.e. <code>is_callable($callback) === TRUE</code>).  PHPUnit will pass the callback all of the parameters that the mocked method was passed, in the same order / argument index (i.e. the callback is invoked by <code>call_user_func_array()</code>).
-: You can usually create the callback in your testcase, as long as doesn't begin with "test"</p>
-
-<p>Obviously if you really want to you can create your own MockObject stub, but these three should cover most situations.</p>
-
-<p>Updating our example gives:</p>
-
-<pre><code>$mock-&gt;expects($this-&gt;once())
-    -&gt;method('check')
-    -&gt;with()
-    -&gt;will($this-&gt;returnValue(TRUE));
-</code></pre>
-
-<p>And we're done!</p>
-
-<p>If you now call <code>$mock-&gt;check()</code> the value TRUE should be returned.</p>
-
-<p>If you don't call a mocked method and PHPUnit expects it to be called then the test the mock was generated for will fail.</p>
-
-
-</article></body></html>
\ No newline at end of file
diff --git a/doc/dev/testing/kohana/mockobjects.md b/doc/dev/testing/kohana/mockobjects.md
deleted file mode 100644
index 64b2d230240810061c619aed89f0f594f9e04e14..0000000000000000000000000000000000000000
--- a/doc/dev/testing/kohana/mockobjects.md
+++ /dev/null
@@ -1,265 +0,0 @@
-# Mock objects
-
-Sometimes when writing tests you need to test something that depends on an object being in a certain state.
-
-Say for example you're testing a model - you want to make sure that the model is running the correct query, but you don't want it to run on a real database server.  You can create a mock database connection which responds in the way the model expects, but doesn't actually connect to a physical database.
-
-PHPUnit has a built in mock object creator which can generate mocks for classes (inc. abstract ones) on the fly.  
-It creates a class that extends the one you want to mock.  You can also tell PHPUnit to override certain functions to return set values / assert that they're called in a specific way.
-
-## Creating an instance of a mock class
-
-You create mocks from within testcases using the getMock() function, which is defined in `PHPUnit_Framework_TestCase` like so:
-
-	    getMock($originalClassName, $methods = array(), array $arguments = array(), $mockClassName = '', $callOriginalConstructor = TRUE, $callOriginalClone = TRUE, $callAutoload = TRUE)
-
-`$originalClassName`
-: The name of the class that you want to mock
-
-`$methods`
-: The methods of $originalClassName that you want to mock.  
-  You need to tell PHPUnit in advance because PHP doesn't allow you to extend an object once it's been initialised.
-
-`$arguments`
-: An array of arguments to pass to the mock's constructor
-
-`$mockClassName`
-: Allows you to specify the name that will be given to the mock
-
-`$callOriginalConstructor`
-: Should the mock call its parent's constructor automatically?
-
-`$callOriginalClone`
-: Should the mock call its parent's clone method?
-
-Most of the time you'll only need to use the first two parameters, i.e.:
-
-	$mock = $this->getMock('ORM');
-
-`$mock` now contains a mock of ORM and can be handled as though it were a vanilla instance of `ORM`
-
-	$mock = $this->getMock('ORM', array('check'));
-
-`$mock` now contains a mock of ORM, but this time we're also mocking the check() method.
-
-## Mocking methods
-
-Assuming we've created a mock object like so:
-
-	$mock = $this->getMock('ORM', array('check'));
-
-We now need to tell PHPUnit how to mock the check function when its called.
-
-### How many times should it be called?
-
-You start off by telling PHPUnit how many times the method should be called by calling expects() on the mock object:
-
-	$mock->expects($matcher);
-
-`expects()` takes one argument, an invoker matcher which you can create using factory methods defined in `PHPUnit_Framework_TestCase`:
-
-#### Possible invoker matchers:
-
-`$this->any()`
-: Returns a matcher that allows the method to be called any number of times
-
-`$this->never()`
-: Returns a matcher that asserts that the method is never called
-
-`$this->once()`
-: Returns a matcher that asserts that the method is only called once
-
-`$this->atLeastOnce()`
-: Returns a matcher that asserts that the method is called at least once
-
-`$this->exactly($count)`
-: Returns a matcher that asserts that the method is called at least `$count` times
-
-`$this->at($index)`
-: Returns a matcher that matches when the method it is evaluated for is invoked at the given $index.
-
-In our example we want `check()` to be called once on our mock object, so if we update it accordingly:
-
-	$mock = $this->getMock('ORM', array('check'));
-
-	$mock->expects($this->once());
-
-### What is the method we're mocking?
-
-Although we told PHPUnit what methods we want to mock, we haven't actually told it what method these rules we're specifiying apply to.  
-You do this by calling `method()` on the returned from `expects()`:
-
-	$mock->expects($matcher)
-		->method($methodName);
-
-As you can probably guess, `method()` takes one parameter, the name of the method you're mocking.  
-There's nothing very fancy about this function.
-
-	$mock = $this->GetMock('ORM', array('check'));
-
-	$mock->expects($this->once())
-		->method('check');
-
-
-### What parameters should our mock method expect?
-
-There are two ways to do this, either
-
-* Tell the method to accept any parameters
-* Tell the method to accept a specific set of parameters
-
-The former can be achieved by calling `withAnyParameters()` on the object returned from `method()`
-
-	$mock->expects($matcher)
-		->method($methodName)
-		->withAnyParameters();
-
-To only allow specific parameters you can use the `with()` method which accepts any number of parameters.  
-The order in which you define the parameters is the order that it expects them to be in when called.
-
-	$mock->expects($matcher)
-		->method($methodName)
-		->with($param1, $param2);
-
-Calling `with()` without any parameters will force the mock method to accept no parameters.
-
-PHPUnit has a fairly complex way of comparing parameters passed to the mock method with the expected values, which can be summarised like so - 
-
-* If the values are identical, they are equal
-* If the values are of different types they are not equal
-* If the values are numbers they they are considered equal if their difference is equal to zero (this level of accuracy can be changed)
-* If the values are objects then they are converted to arrays and are compared as arrays
-* If the values are arrays then any sub-arrays deeper than x levels (default 10) are ignored in the comparision
-* If the values are arrays and one contains more than elements that the other (at any depth up to the max depth), then they are not equal
-
-#### More advanced parameter comparisions
-
-Sometimes you need to be more specific about how PHPUnit should compare parameters, i.e. if you want to make sure that one of the parameters is an instance of an object, yet isn't necessarily identical to a particular instance.
-
-In PHPUnit, the logic for validating objects and datatypes has been refactored into "constraint objects".  If you look in any of the assertX() methods you can see that they are nothing more than wrappers for associating constraint objects with tests.
-
-If a parameter passed to `with()` is not an instance of a constraint object (one which extends `PHPUnit_Framework_Constraint`) then PHPUnit creates a new `IsEqual` comparision object for it.
-
-i.e., the following methods produce the same result:
-
-	->with('foo', 1);
-
-	->with($this->equalTo('foo'), $this->equalTo(1));
-
-Here are some of the wrappers PHPUnit provides for creating constraint objects:
-
-`$this->arrayHasKey($key)`
-: Asserts that the parameter will have an element with index `$key`
-
-`$this->attribute(PHPUnit_Framework_Constraint $constraint, $attributeName)`
-: Asserts that object attribute `$attributeName` of the parameter will satisfy `$constraint`, where constraint is an instance of a constraint (i.e. `$this->equalTo()`)
-
-`$this->fileExists()`
-: Accepts no parameters, asserts that the parameter is a path to a valid file (i.e. `file_exists() === TRUE`)
-
-`$this->greaterThan($value)`
-: Asserts that the parameter is greater than `$value`
-
-`$this->anything()`
-: Returns TRUE regardless of what the parameter is
-
-`$this->equalTo($value, $delta = 0, $canonicalizeEOL = FALSE, $ignoreCase = False)`
-: Asserts that the parameter is equal to `$value` (same as not passing a constraint object to `with()`)
-: `$delta` is the degree of accuracy to use when comparing numbers. i.e. 0 means numbers need to be identical, 1 means numbers can be within a distance of one from each other
-: If `$canonicalizeEOL` is TRUE then all newlines in string values will be converted to `\n` before comparision
-: If `$ignoreCase` is TRUE then both strings will be converted to lowercase before comparision
-
-`$this->identicalTo($value)`
-: Asserts that the parameter is identical to `$value`
-
-`$this->isType($type)`
-: Asserts that the parameter is of type `$type`, where `$type` is a string representation of the core PHP data types
-
-`$this->isInstanceOf($className)`
-: Asserts that the parameter is an instance of `$className`
-
-`$this->lessThan($value)`
-: Asserts that the parameter is less than `$value`
-
-`$this->objectHasAttribute($attribute)`
-: Asserts that the paramater (which is assumed to be an object) has an attribute `$attribute`
-
-`$this->matchesRegularExpression($pattern)`
-: Asserts that the parameter matches the PCRE pattern `$pattern` (using `preg_match()`)
-
-`$this->stringContains($string, $ignoreCase = FALSE)`
-: Asserts that the parameter contains the string `$string`.  If `$ignoreCase` is TRUE then a case insensitive comparision is done
-
-`$this->stringEndsWith($suffix)`
-: Asserts that the parameter ends with `$suffix` (assumes parameter is a string)
-
-`$this->stringStartsWith($prefix)`
-: Asserts that the parameter starts with `$prefix` (assumes parameter is a string)
-
-`$this->contains($value)`
-: Asserts that the parameter contains at least one value that is identical to `$value` (assumes parameter is array or `SplObjectStorage`)
-
-`$this->containsOnly($type, $isNativeType = TRUE)`
-: Asserts that the parameter only contains items of type `$type`. `$isNativeType` should be set to TRUE when `$type` refers to a built in PHP data type (i.e. int, string etc.) (assumes parameter is array)
-
-
-There are more constraint objects than listed here, look in `PHPUnit_Framework_Assert` and `PHPUnit/Framework/Constraint` if you need more constraints.
-
-If we continue our example, we have the following:  
-	
-	$mock->expects($this->once())
-		->method('check')
-		->with();
-
-So far PHPUnit knows that we want the `check()` method to be called once, with no parameters.  Now we just need to get it to return something...
-
-### What should the method return?
-
-This is the final stage of mocking a method.
-
-By default PHPUnit can return either
-
-* A fixed value
-* One of the parameters that were passed to it
-* The return value of a specified callback
-
-Specifying a return value is easy, just call `will()` on the object returned by either `method()` or `with()`.
-
-The function is defined like so:
-
-	public function will(PHPUnit_Framework_MockObject_Stub $stub)
-
-PHPUnit provides some MockObject stubs out of the box, you can access them via (when called from a testcase):
-
-`$this->returnValue($value)`
-: Returns `$value` when the mocked method is called
-
-`$this->returnArgument($argumentIndex)`
-: Returns the `$argumentIndex`th argument that was passed to the mocked method
-
-`$this->returnCallback($callback)`
-: Returns the value of the callback, useful for more complicated mocking.  
-: `$callback` should a valid callback (i.e. `is_callable($callback) === TRUE`).  PHPUnit will pass the callback all of the parameters that the mocked method was passed, in the same order / argument index (i.e. the callback is invoked by `call_user_func_array()`).
-: You can usually create the callback in your testcase, as long as doesn't begin with "test"
-
-Obviously if you really want to you can create your own MockObject stub, but these three should cover most situations.
-
-Updating our example gives:
-
-	$mock->expects($this->once())
-		->method('check')
-		->with()
-		->will($this->returnValue(TRUE));
-
-
-And we're done!
-
-If you now call `$mock->check()` the value TRUE should be returned.
-
-If you don't call a mocked method and PHPUnit expects it to be called then the test the mock was generated for will fail.
-
-
-<!--
-### What about if the mocked method should change everytime its called?
-
--->
diff --git a/doc/dev/testing/kohana/testing_workflows.html b/doc/dev/testing/kohana/testing_workflows.html
deleted file mode 100644
index fbebf0db7f7b4dea40c337261cace6c9fc0eae9c..0000000000000000000000000000000000000000
--- a/doc/dev/testing/kohana/testing_workflows.html
+++ /dev/null
@@ -1,909 +0,0 @@
-<!DOCTYPE html><html><head><meta charset="utf-8"><style>body {
-  width: 45em;
-  border: 1px solid #ddd;
-  outline: 1300px solid #fff;
-  margin: 16px auto;
-}
-
-body .markdown-body
-{
-  padding: 30px;
-}
-
-@font-face {
-  font-family: octicons-anchor;
-  src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAYcAA0AAAAACjQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABMAAAABwAAAAca8vGTk9TLzIAAAFMAAAARAAAAFZG1VHVY21hcAAAAZAAAAA+AAABQgAP9AdjdnQgAAAB0AAAAAQAAAAEACICiGdhc3AAAAHUAAAACAAAAAj//wADZ2x5ZgAAAdwAAADRAAABEKyikaNoZWFkAAACsAAAAC0AAAA2AtXoA2hoZWEAAALgAAAAHAAAACQHngNFaG10eAAAAvwAAAAQAAAAEAwAACJsb2NhAAADDAAAAAoAAAAKALIAVG1heHAAAAMYAAAAHwAAACABEAB2bmFtZQAAAzgAAALBAAAFu3I9x/Nwb3N0AAAF/AAAAB0AAAAvaoFvbwAAAAEAAAAAzBdyYwAAAADP2IQvAAAAAM/bz7t4nGNgZGFgnMDAysDB1Ml0hoGBoR9CM75mMGLkYGBgYmBlZsAKAtJcUxgcPsR8iGF2+O/AEMPsznAYKMwIkgMA5REMOXicY2BgYGaAYBkGRgYQsAHyGMF8FgYFIM0ChED+h5j//yEk/3KoSgZGNgYYk4GRCUgwMaACRoZhDwCs7QgGAAAAIgKIAAAAAf//AAJ4nHWMMQrCQBBF/0zWrCCIKUQsTDCL2EXMohYGSSmorScInsRGL2DOYJe0Ntp7BK+gJ1BxF1stZvjz/v8DRghQzEc4kIgKwiAppcA9LtzKLSkdNhKFY3HF4lK69ExKslx7Xa+vPRVS43G98vG1DnkDMIBUgFN0MDXflU8tbaZOUkXUH0+U27RoRpOIyCKjbMCVejwypzJJG4jIwb43rfl6wbwanocrJm9XFYfskuVC5K/TPyczNU7b84CXcbxks1Un6H6tLH9vf2LRnn8Ax7A5WQAAAHicY2BkYGAA4teL1+yI57f5ysDNwgAC529f0kOmWRiYVgEpDgYmEA8AUzEKsQAAAHicY2BkYGB2+O/AEMPCAAJAkpEBFbAAADgKAe0EAAAiAAAAAAQAAAAEAAAAAAAAKgAqACoAiAAAeJxjYGRgYGBhsGFgYgABEMkFhAwM/xn0QAIAD6YBhwB4nI1Ty07cMBS9QwKlQapQW3VXySvEqDCZGbGaHULiIQ1FKgjWMxknMfLEke2A+IJu+wntrt/QbVf9gG75jK577Lg8K1qQPCfnnnt8fX1NRC/pmjrk/zprC+8D7tBy9DHgBXoWfQ44Av8t4Bj4Z8CLtBL9CniJluPXASf0Lm4CXqFX8Q84dOLnMB17N4c7tBo1AS/Qi+hTwBH4rwHHwN8DXqQ30XXAS7QaLwSc0Gn8NuAVWou/gFmnjLrEaEh9GmDdDGgL3B4JsrRPDU2hTOiMSuJUIdKQQayiAth69r6akSSFqIJuA19TrzCIaY8sIoxyrNIrL//pw7A2iMygkX5vDj+G+kuoLdX4GlGK/8Lnlz6/h9MpmoO9rafrz7ILXEHHaAx95s9lsI7AHNMBWEZHULnfAXwG9/ZqdzLI08iuwRloXE8kfhXYAvE23+23DU3t626rbs8/8adv+9DWknsHp3E17oCf+Z48rvEQNZ78paYM38qfk3v/u3l3u3GXN2Dmvmvpf1Srwk3pB/VSsp512bA/GG5i2WJ7wu430yQ5K3nFGiOqgtmSB5pJVSizwaacmUZzZhXLlZTq8qGGFY2YcSkqbth6aW1tRmlaCFs2016m5qn36SbJrqosG4uMV4aP2PHBmB3tjtmgN2izkGQyLWprekbIntJFing32a5rKWCN/SdSoga45EJykyQ7asZvHQ8PTm6cslIpwyeyjbVltNikc2HTR7YKh9LBl9DADC0U/jLcBZDKrMhUBfQBvXRzLtFtjU9eNHKin0x5InTqb8lNpfKv1s1xHzTXRqgKzek/mb7nB8RZTCDhGEX3kK/8Q75AmUM/eLkfA+0Hi908Kx4eNsMgudg5GLdRD7a84npi+YxNr5i5KIbW5izXas7cHXIMAau1OueZhfj+cOcP3P8MNIWLyYOBuxL6DRylJ4cAAAB4nGNgYoAALjDJyIAOWMCiTIxMLDmZedkABtIBygAAAA==) format('woff');
-}
-
-.markdown-body {
-  -ms-text-size-adjust: 100%;
-  -webkit-text-size-adjust: 100%;
-  color: #333;
-  overflow: hidden;
-  font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif;
-  font-size: 16px;
-  line-height: 1.6;
-  word-wrap: break-word;
-}
-
-.markdown-body a {
-  background: transparent;
-}
-
-.markdown-body a:active,
-.markdown-body a:hover {
-  outline: 0;
-}
-
-.markdown-body strong {
-  font-weight: bold;
-}
-
-.markdown-body h1 {
-  font-size: 2em;
-  margin: 0.67em 0;
-}
-
-.markdown-body img {
-  border: 0;
-}
-
-.markdown-body hr {
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-  height: 0;
-}
-
-.markdown-body pre {
-  overflow: auto;
-}
-
-.markdown-body code,
-.markdown-body kbd,
-.markdown-body pre {
-  font-family: monospace, monospace;
-  font-size: 1em;
-}
-
-.markdown-body input {
-  color: inherit;
-  font: inherit;
-  margin: 0;
-}
-
-.markdown-body html input[disabled] {
-  cursor: default;
-}
-
-.markdown-body input {
-  line-height: normal;
-}
-
-.markdown-body input[type="checkbox"] {
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  padding: 0;
-}
-
-.markdown-body table {
-  border-collapse: collapse;
-  border-spacing: 0;
-}
-
-.markdown-body td,
-.markdown-body th {
-  padding: 0;
-}
-
-.markdown-body * {
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-
-.markdown-body input {
-  font: 13px/1.4 Helvetica, arial, freesans, clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol";
-}
-
-.markdown-body a {
-  color: #4183c4;
-  text-decoration: none;
-}
-
-.markdown-body a:hover,
-.markdown-body a:focus,
-.markdown-body a:active {
-  text-decoration: underline;
-}
-
-.markdown-body hr {
-  height: 0;
-  margin: 15px 0;
-  overflow: hidden;
-  background: transparent;
-  border: 0;
-  border-bottom: 1px solid #ddd;
-}
-
-.markdown-body hr:before {
-  display: table;
-  content: "";
-}
-
-.markdown-body hr:after {
-  display: table;
-  clear: both;
-  content: "";
-}
-
-.markdown-body h1,
-.markdown-body h2,
-.markdown-body h3,
-.markdown-body h4,
-.markdown-body h5,
-.markdown-body h6 {
-  margin-top: 15px;
-  margin-bottom: 15px;
-  line-height: 1.1;
-}
-
-.markdown-body h1 {
-  font-size: 30px;
-}
-
-.markdown-body h2 {
-  font-size: 21px;
-}
-
-.markdown-body h3 {
-  font-size: 16px;
-}
-
-.markdown-body h4 {
-  font-size: 14px;
-}
-
-.markdown-body h5 {
-  font-size: 12px;
-}
-
-.markdown-body h6 {
-  font-size: 11px;
-}
-
-.markdown-body blockquote {
-  margin: 0;
-}
-
-.markdown-body ul,
-.markdown-body ol {
-  padding: 0;
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-.markdown-body ol ol,
-.markdown-body ul ol {
-  list-style-type: lower-roman;
-}
-
-.markdown-body ul ul ol,
-.markdown-body ul ol ol,
-.markdown-body ol ul ol,
-.markdown-body ol ol ol {
-  list-style-type: lower-alpha;
-}
-
-.markdown-body dd {
-  margin-left: 0;
-}
-
-.markdown-body code {
-  font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace;
-}
-
-.markdown-body pre {
-  margin-top: 0;
-  margin-bottom: 0;
-  font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace;
-}
-
-.markdown-body .octicon {
-  font: normal normal 16px octicons-anchor;
-  line-height: 1;
-  display: inline-block;
-  text-decoration: none;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-
-.markdown-body .octicon-link:before {
-  content: '\f05c';
-}
-
-.markdown-body>*:first-child {
-  margin-top: 0 !important;
-}
-
-.markdown-body>*:last-child {
-  margin-bottom: 0 !important;
-}
-
-.markdown-body .anchor {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  display: block;
-  padding-right: 6px;
-  padding-left: 30px;
-  margin-left: -30px;
-}
-
-.markdown-body .anchor:focus {
-  outline: none;
-}
-
-.markdown-body h1,
-.markdown-body h2,
-.markdown-body h3,
-.markdown-body h4,
-.markdown-body h5,
-.markdown-body h6 {
-  position: relative;
-  margin-top: 1em;
-  margin-bottom: 16px;
-  font-weight: bold;
-  line-height: 1.4;
-}
-
-.markdown-body h1 .octicon-link,
-.markdown-body h2 .octicon-link,
-.markdown-body h3 .octicon-link,
-.markdown-body h4 .octicon-link,
-.markdown-body h5 .octicon-link,
-.markdown-body h6 .octicon-link {
-  display: none;
-  color: #000;
-  vertical-align: middle;
-}
-
-.markdown-body h1:hover .anchor,
-.markdown-body h2:hover .anchor,
-.markdown-body h3:hover .anchor,
-.markdown-body h4:hover .anchor,
-.markdown-body h5:hover .anchor,
-.markdown-body h6:hover .anchor {
-  padding-left: 8px;
-  margin-left: -30px;
-  line-height: 1;
-  text-decoration: none;
-}
-
-.markdown-body h1:hover .anchor .octicon-link,
-.markdown-body h2:hover .anchor .octicon-link,
-.markdown-body h3:hover .anchor .octicon-link,
-.markdown-body h4:hover .anchor .octicon-link,
-.markdown-body h5:hover .anchor .octicon-link,
-.markdown-body h6:hover .anchor .octicon-link {
-  display: inline-block;
-}
-
-.markdown-body h1 {
-  padding-bottom: 0.3em;
-  font-size: 2.25em;
-  line-height: 1.2;
-  border-bottom: 1px solid #eee;
-}
-
-.markdown-body h2 {
-  padding-bottom: 0.3em;
-  font-size: 1.75em;
-  line-height: 1.225;
-  border-bottom: 1px solid #eee;
-}
-
-.markdown-body h3 {
-  font-size: 1.5em;
-  line-height: 1.43;
-}
-
-.markdown-body h4 {
-  font-size: 1.25em;
-}
-
-.markdown-body h5 {
-  font-size: 1em;
-}
-
-.markdown-body h6 {
-  font-size: 1em;
-  color: #777;
-}
-
-.markdown-body p,
-.markdown-body blockquote,
-.markdown-body ul,
-.markdown-body ol,
-.markdown-body dl,
-.markdown-body table,
-.markdown-body pre {
-  margin-top: 0;
-  margin-bottom: 16px;
-}
-
-.markdown-body hr {
-  height: 4px;
-  padding: 0;
-  margin: 16px 0;
-  background-color: #e7e7e7;
-  border: 0 none;
-}
-
-.markdown-body ul,
-.markdown-body ol {
-  padding-left: 2em;
-}
-
-.markdown-body ul ul,
-.markdown-body ul ol,
-.markdown-body ol ol,
-.markdown-body ol ul {
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-.markdown-body li>p {
-  margin-top: 16px;
-}
-
-.markdown-body dl {
-  padding: 0;
-}
-
-.markdown-body dl dt {
-  padding: 0;
-  margin-top: 16px;
-  font-size: 1em;
-  font-style: italic;
-  font-weight: bold;
-}
-
-.markdown-body dl dd {
-  padding: 0 16px;
-  margin-bottom: 16px;
-}
-
-.markdown-body blockquote {
-  padding: 0 15px;
-  color: #777;
-  border-left: 4px solid #ddd;
-}
-
-.markdown-body blockquote>:first-child {
-  margin-top: 0;
-}
-
-.markdown-body blockquote>:last-child {
-  margin-bottom: 0;
-}
-
-.markdown-body table {
-  display: block;
-  width: 100%;
-  overflow: auto;
-  word-break: normal;
-  word-break: keep-all;
-}
-
-.markdown-body table th {
-  font-weight: bold;
-}
-
-.markdown-body table th,
-.markdown-body table td {
-  padding: 6px 13px;
-  border: 1px solid #ddd;
-}
-
-.markdown-body table tr {
-  background-color: #fff;
-  border-top: 1px solid #ccc;
-}
-
-.markdown-body table tr:nth-child(2n) {
-  background-color: #f8f8f8;
-}
-
-.markdown-body img {
-  max-width: 100%;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-
-.markdown-body code {
-  padding: 0;
-  padding-top: 0.2em;
-  padding-bottom: 0.2em;
-  margin: 0;
-  font-size: 85%;
-  background-color: rgba(0,0,0,0.04);
-  border-radius: 3px;
-}
-
-.markdown-body code:before,
-.markdown-body code:after {
-  letter-spacing: -0.2em;
-  content: "\00a0";
-}
-
-.markdown-body pre>code {
-  padding: 0;
-  margin: 0;
-  font-size: 100%;
-  word-break: normal;
-  white-space: pre;
-  background: transparent;
-  border: 0;
-}
-
-.markdown-body .highlight {
-  margin-bottom: 16px;
-}
-
-.markdown-body .highlight pre,
-.markdown-body pre {
-  padding: 16px;
-  overflow: auto;
-  font-size: 85%;
-  line-height: 1.45;
-  background-color: #f7f7f7;
-  border-radius: 3px;
-}
-
-.markdown-body .highlight pre {
-  margin-bottom: 0;
-  word-break: normal;
-}
-
-.markdown-body pre {
-  word-wrap: normal;
-}
-
-.markdown-body pre code {
-  display: inline;
-  max-width: initial;
-  padding: 0;
-  margin: 0;
-  overflow: initial;
-  line-height: inherit;
-  word-wrap: normal;
-  background-color: transparent;
-  border: 0;
-}
-
-.markdown-body pre code:before,
-.markdown-body pre code:after {
-  content: normal;
-}
-
-.markdown-body .highlight {
-  background: #fff;
-}
-
-.markdown-body .highlight .h {
-  color: #333;
-  font-style: normal;
-  font-weight: normal;
-}
-
-.markdown-body .highlight .mf,
-.markdown-body .highlight .mh,
-.markdown-body .highlight .mi,
-.markdown-body .highlight .mo,
-.markdown-body .highlight .il,
-.markdown-body .highlight .m {
-  color: #945277;
-}
-
-.markdown-body .highlight .s,
-.markdown-body .highlight .sb,
-.markdown-body .highlight .sc,
-.markdown-body .highlight .sd,
-.markdown-body .highlight .s2,
-.markdown-body .highlight .se,
-.markdown-body .highlight .sh,
-.markdown-body .highlight .si,
-.markdown-body .highlight .sx,
-.markdown-body .highlight .s1 {
-  color: #df5000;
-}
-
-.markdown-body .highlight .kc,
-.markdown-body .highlight .kd,
-.markdown-body .highlight .kn,
-.markdown-body .highlight .kp,
-.markdown-body .highlight .kr,
-.markdown-body .highlight .kt,
-.markdown-body .highlight .k,
-.markdown-body .highlight .o {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .kt {
-  color: #458;
-}
-
-.markdown-body .highlight .c,
-.markdown-body .highlight .cm,
-.markdown-body .highlight .c1 {
-  color: #998;
-  font-style: italic;
-}
-
-.markdown-body .highlight .cp,
-.markdown-body .highlight .cs,
-.markdown-body .highlight .cp .h {
-  color: #999;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .cs {
-  font-style: italic;
-}
-
-.markdown-body .highlight .n {
-  color: #333;
-}
-
-.markdown-body .highlight .na,
-.markdown-body .highlight .nv,
-.markdown-body .highlight .vc,
-.markdown-body .highlight .vg,
-.markdown-body .highlight .vi {
-  color: #008080;
-}
-
-.markdown-body .highlight .nb {
-  color: #0086B3;
-}
-
-.markdown-body .highlight .nc {
-  color: #458;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .no {
-  color: #094e99;
-}
-
-.markdown-body .highlight .ni {
-  color: #800080;
-}
-
-.markdown-body .highlight .ne {
-  color: #990000;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .nf {
-  color: #945277;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .nn {
-  color: #555;
-}
-
-.markdown-body .highlight .nt {
-  color: #000080;
-}
-
-.markdown-body .highlight .err {
-  color: #a61717;
-  background-color: #e3d2d2;
-}
-
-.markdown-body .highlight .gd {
-  color: #000;
-  background-color: #fdd;
-}
-
-.markdown-body .highlight .gd .x {
-  color: #000;
-  background-color: #faa;
-}
-
-.markdown-body .highlight .ge {
-  font-style: italic;
-}
-
-.markdown-body .highlight .gr {
-  color: #aa0000;
-}
-
-.markdown-body .highlight .gh {
-  color: #999;
-}
-
-.markdown-body .highlight .gi {
-  color: #000;
-  background-color: #dfd;
-}
-
-.markdown-body .highlight .gi .x {
-  color: #000;
-  background-color: #afa;
-}
-
-.markdown-body .highlight .go {
-  color: #888;
-}
-
-.markdown-body .highlight .gp {
-  color: #555;
-}
-
-.markdown-body .highlight .gs {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .gu {
-  color: #800080;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .gt {
-  color: #aa0000;
-}
-
-.markdown-body .highlight .ow {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .w {
-  color: #bbb;
-}
-
-.markdown-body .highlight .sr {
-  color: #017936;
-}
-
-.markdown-body .highlight .ss {
-  color: #8b467f;
-}
-
-.markdown-body .highlight .bp {
-  color: #999;
-}
-
-.markdown-body .highlight .gc {
-  color: #999;
-  background-color: #EAF2F5;
-}
-
-.markdown-body kbd {
-  background-color: #e7e7e7;
-  background-image: -webkit-linear-gradient(#fefefe, #e7e7e7);
-  background-image: linear-gradient(#fefefe, #e7e7e7);
-  background-repeat: repeat-x;
-  display: inline-block;
-  padding: 3px 5px;
-  font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace;
-  line-height: 10px;
-  color: #000;
-  border: 1px solid #cfcfcf;
-  border-radius: 2px;
-}
-
-.markdown-body .highlight .pl-coc,
-.markdown-body .highlight .pl-entm,
-.markdown-body .highlight .pl-eoa,
-.markdown-body .highlight .pl-mai .pl-sf,
-.markdown-body .highlight .pl-pdv,
-.markdown-body .highlight .pl-sc,
-.markdown-body .highlight .pl-sr,
-.markdown-body .highlight .pl-v,
-.markdown-body .highlight .pl-vpf {
-  color: #0086b3;
-}
-
-.markdown-body .highlight .pl-eoac,
-.markdown-body .highlight .pl-mdht,
-.markdown-body .highlight .pl-mi1,
-.markdown-body .highlight .pl-mri,
-.markdown-body .highlight .pl-va,
-.markdown-body .highlight .pl-vpu {
-  color: #008080;
-}
-
-.markdown-body .highlight .pl-c,
-.markdown-body .highlight .pl-pdc {
-  color: #b4b7b4;
-  font-style: italic;
-}
-
-.markdown-body .highlight .pl-k,
-.markdown-body .highlight .pl-ko,
-.markdown-body .highlight .pl-kolp,
-.markdown-body .highlight .pl-mc,
-.markdown-body .highlight .pl-mr,
-.markdown-body .highlight .pl-ms,
-.markdown-body .highlight .pl-s,
-.markdown-body .highlight .pl-sok,
-.markdown-body .highlight .pl-st {
-  color: #6e5494;
-}
-
-.markdown-body .highlight .pl-ef,
-.markdown-body .highlight .pl-enf,
-.markdown-body .highlight .pl-enm,
-.markdown-body .highlight .pl-entc,
-.markdown-body .highlight .pl-eoi,
-.markdown-body .highlight .pl-sf,
-.markdown-body .highlight .pl-smc {
-  color: #d12089;
-}
-
-.markdown-body .highlight .pl-ens,
-.markdown-body .highlight .pl-eoai,
-.markdown-body .highlight .pl-kos,
-.markdown-body .highlight .pl-mh .pl-pdh,
-.markdown-body .highlight .pl-mp,
-.markdown-body .highlight .pl-pde,
-.markdown-body .highlight .pl-stp {
-  color: #458;
-}
-
-.markdown-body .highlight .pl-enti {
-  color: #d12089;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-cce,
-.markdown-body .highlight .pl-enc,
-.markdown-body .highlight .pl-kou,
-.markdown-body .highlight .pl-mq {
-  color: #f93;
-}
-
-.markdown-body .highlight .pl-mp1 .pl-sf {
-  color: #458;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-cos,
-.markdown-body .highlight .pl-ent,
-.markdown-body .highlight .pl-md,
-.markdown-body .highlight .pl-mdhf,
-.markdown-body .highlight .pl-ml,
-.markdown-body .highlight .pl-pdc1,
-.markdown-body .highlight .pl-pds,
-.markdown-body .highlight .pl-s1,
-.markdown-body .highlight .pl-scp,
-.markdown-body .highlight .pl-sol {
-  color: #df5000;
-}
-
-.markdown-body .highlight .pl-c1,
-.markdown-body .highlight .pl-cn,
-.markdown-body .highlight .pl-pse,
-.markdown-body .highlight .pl-pse .pl-s2,
-.markdown-body .highlight .pl-vi {
-  color: #a31515;
-}
-
-.markdown-body .highlight .pl-mb,
-.markdown-body .highlight .pl-pdb {
-  color: #df5000;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-mi,
-.markdown-body .highlight .pl-pdi {
-  color: #6e5494;
-  font-style: italic;
-}
-
-.markdown-body .highlight .pl-ms1 {
-  background-color: #f5f5f5;
-}
-
-.markdown-body .highlight .pl-mdh,
-.markdown-body .highlight .pl-mdi {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-mdr {
-  color: #0086b3;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-s2 {
-  color: #333;
-}
-
-.markdown-body .highlight .pl-ii {
-  background-color: #df5000;
-  color: #fff;
-}
-
-.markdown-body .highlight .pl-ib {
-  background-color: #f93;
-}
-
-.markdown-body .highlight .pl-id {
-  background-color: #a31515;
-  color: #fff;
-}
-
-.markdown-body .highlight .pl-iu {
-  background-color: #b4b7b4;
-}
-
-.markdown-body .highlight .pl-mo {
-  color: #969896;
-}
-
-.markdown-body .task-list-item {
-  list-style-type: none;
-}
-
-.markdown-body .task-list-item+.task-list-item {
-  margin-top: 3px;
-}
-
-.markdown-body .task-list-item input {
-  float: left;
-  margin: 0.3em 0 0.25em -1.6em;
-  vertical-align: middle;
-}</style><title>testing_workflows</title></head><body><article class="markdown-body"><h1 id="testing-workflows">
-<a id="user-content-testing-workflows" class="anchor" href="#testing-workflows" aria-hidden="true"><span class="octicon octicon-link"></span></a>Testing workflows</h1>
-
-<p>Having unittests for your application is a nice idea, but unless you actually use them they're about as useful as a chocolate firegaurd.  There are quite a few ways of getting tests "into" your development process and this guide aims to cover a few of them.</p>
-
-<h2 id="integrating-with-ides">
-<a id="user-content-integrating-with-ides" class="anchor" href="#integrating-with-ides" aria-hidden="true"><span class="octicon octicon-link"></span></a>Integrating with IDEs</h2>
-
-<p>Modern IDEs have come a long way in the last couple of years and ones like netbeans have pretty decent PHP / PHPUnit support.</p>
-
-<h3 id="netbeans-68">
-<a id="user-content-netbeans-68" class="anchor" href="#netbeans-68" aria-hidden="true"><span class="octicon octicon-link"></span></a>Netbeans (6.8+)</h3>
-
-<p><em>Note:</em> Netbeans runs under the assumption that you only have one tests folder per project.<br>
-If you want to run tests across multiple modules it might be best creating a separate project for each module.</p>
-
-<ol>
-<li><p>Install the unittest module</p></li>
-<li><p>Open the project which you want to enable phpunit testing for.</p></li>
-<li><p>Now open the project's properties dialouge and in the "Tests Dir" field enter the path to your module's (or application's) test directory.<br>
-In this case the only tests in this project are within the unittest module</p></li>
-<li><p>Select the phpunit section from the left hand pane and in the area labelled bootstrap enter the path to your app's index.php file</p></li>
-</ol>
-
-<p>You can also specify a custom test suite loader (enter the path to your tests.php file) and/or a custom configuration file (enter the path to your phpunit.xml file)</p>
-
-<h2 id="looping-shell">
-<a id="user-content-looping-shell" class="anchor" href="#looping-shell" aria-hidden="true"><span class="octicon octicon-link"></span></a>Looping shell</h2>
-
-<p>If you're developing in a text editor such as textmate, vim, gedit etc. chances are phpunit support isn't natively supported by your editor.</p>
-
-<p>In such situations you can run a simple bash script to loop over the tests every X seconds, here's an example script:</p>
-
-<pre><code>while(true) do clear; phpunit; sleep 8; done;
-</code></pre>
-
-<p>You will probably need to adjust the timeout (<code>sleep 8</code>) to suit your own workflow, but 8 seconds seems to be about enough time to see what's erroring before the tests are re-run.</p>
-
-<p>In the above example we're using a phpunit.xml config file to specify all the unit testing settings &amp; to reduce the complexity of the looping script.</p>
-
-<h2 id="continuous-integration-ci">
-<a id="user-content-continuous-integration-ci" class="anchor" href="#continuous-integration-ci" aria-hidden="true"><span class="octicon octicon-link"></span></a>Continuous Integration (CI)</h2>
-
-<p>Continuous integration is a team based tool which enables developers to keep tabs on whether changes committed to a project break the application. If a commit causes a test to fail then the build is classed as "broken" and the CI server then alerts developers by email, RSS, IM or glowing (bears|lava lamps) to the fact that someone has broken the build and that all hell's broken lose.</p>
-
-<p>The two more popular CI servers are <a href="https://hudson.dev.java.net/">Hudson</a> and <a href="http://www.phpundercontrol.org/about.html">phpUnderControl</a>, both of which use <a href="http://phing.info/">Phing</a> to run the build tasks for your application.</p>
-</article></body></html>
\ No newline at end of file
diff --git a/doc/dev/testing/kohana/testing_workflows.md b/doc/dev/testing/kohana/testing_workflows.md
deleted file mode 100644
index 893ab6227e229d9284a0116561f7ce6ccbadf1ad..0000000000000000000000000000000000000000
--- a/doc/dev/testing/kohana/testing_workflows.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# Testing workflows
-
-Having unittests for your application is a nice idea, but unless you actually use them they're about as useful as a chocolate firegaurd.  There are quite a few ways of getting tests "into" your development process and this guide aims to cover a few of them.
-
-## Integrating with IDEs
-
-Modern IDEs have come a long way in the last couple of years and ones like netbeans have pretty decent PHP / PHPUnit support.
-
-### Netbeans (6.8+)
-
-*Note:* Netbeans runs under the assumption that you only have one tests folder per project.  
-If you want to run tests across multiple modules it might be best creating a separate project for each module.
-
-0. Install the unittest module
-
-1. Open the project which you want to enable phpunit testing for.
-
-2. Now open the project's properties dialouge and in the "Tests Dir" field enter the path to your module's (or application's) test directory.  
-   In this case the only tests in this project are within the unittest module
-
-3. Select the phpunit section from the left hand pane and in the area labelled bootstrap enter the path to your app's index.php file
-
-You can also specify a custom test suite loader (enter the path to your tests.php file) and/or a custom configuration file (enter the path to your phpunit.xml file)
-
-## Looping shell
-
-If you're developing in a text editor such as textmate, vim, gedit etc. chances are phpunit support isn't natively supported by your editor.
-
-In such situations you can run a simple bash script to loop over the tests every X seconds, here's an example script:
-
-	while(true) do clear; phpunit; sleep 8; done;
-
-You will probably need to adjust the timeout (`sleep 8`) to suit your own workflow, but 8 seconds seems to be about enough time to see what's erroring before the tests are re-run.
-
-In the above example we're using a phpunit.xml config file to specify all the unit testing settings & to reduce the complexity of the looping script.
-
-## Continuous Integration (CI)
-
-Continuous integration is a team based tool which enables developers to keep tabs on whether changes committed to a project break the application. If a commit causes a test to fail then the build is classed as "broken" and the CI server then alerts developers by email, RSS, IM or glowing (bears|lava lamps) to the fact that someone has broken the build and that all hell's broken lose.
-
-The two more popular CI servers are [Hudson](https://hudson.dev.java.net/) and [phpUnderControl](http://www.phpundercontrol.org/about.html), both of which use [Phing](http://phing.info/) to run the build tasks for your application.
diff --git a/doc/dev/testing/kohana/troubleshooting.html b/doc/dev/testing/kohana/troubleshooting.html
deleted file mode 100644
index 4c8010d80f130aea4dd5703805a0ff61f6cbac22..0000000000000000000000000000000000000000
--- a/doc/dev/testing/kohana/troubleshooting.html
+++ /dev/null
@@ -1,890 +0,0 @@
-<!DOCTYPE html><html><head><meta charset="utf-8"><style>body {
-  width: 45em;
-  border: 1px solid #ddd;
-  outline: 1300px solid #fff;
-  margin: 16px auto;
-}
-
-body .markdown-body
-{
-  padding: 30px;
-}
-
-@font-face {
-  font-family: octicons-anchor;
-  src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAYcAA0AAAAACjQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABMAAAABwAAAAca8vGTk9TLzIAAAFMAAAARAAAAFZG1VHVY21hcAAAAZAAAAA+AAABQgAP9AdjdnQgAAAB0AAAAAQAAAAEACICiGdhc3AAAAHUAAAACAAAAAj//wADZ2x5ZgAAAdwAAADRAAABEKyikaNoZWFkAAACsAAAAC0AAAA2AtXoA2hoZWEAAALgAAAAHAAAACQHngNFaG10eAAAAvwAAAAQAAAAEAwAACJsb2NhAAADDAAAAAoAAAAKALIAVG1heHAAAAMYAAAAHwAAACABEAB2bmFtZQAAAzgAAALBAAAFu3I9x/Nwb3N0AAAF/AAAAB0AAAAvaoFvbwAAAAEAAAAAzBdyYwAAAADP2IQvAAAAAM/bz7t4nGNgZGFgnMDAysDB1Ml0hoGBoR9CM75mMGLkYGBgYmBlZsAKAtJcUxgcPsR8iGF2+O/AEMPsznAYKMwIkgMA5REMOXicY2BgYGaAYBkGRgYQsAHyGMF8FgYFIM0ChED+h5j//yEk/3KoSgZGNgYYk4GRCUgwMaACRoZhDwCs7QgGAAAAIgKIAAAAAf//AAJ4nHWMMQrCQBBF/0zWrCCIKUQsTDCL2EXMohYGSSmorScInsRGL2DOYJe0Ntp7BK+gJ1BxF1stZvjz/v8DRghQzEc4kIgKwiAppcA9LtzKLSkdNhKFY3HF4lK69ExKslx7Xa+vPRVS43G98vG1DnkDMIBUgFN0MDXflU8tbaZOUkXUH0+U27RoRpOIyCKjbMCVejwypzJJG4jIwb43rfl6wbwanocrJm9XFYfskuVC5K/TPyczNU7b84CXcbxks1Un6H6tLH9vf2LRnn8Ax7A5WQAAAHicY2BkYGAA4teL1+yI57f5ysDNwgAC529f0kOmWRiYVgEpDgYmEA8AUzEKsQAAAHicY2BkYGB2+O/AEMPCAAJAkpEBFbAAADgKAe0EAAAiAAAAAAQAAAAEAAAAAAAAKgAqACoAiAAAeJxjYGRgYGBhsGFgYgABEMkFhAwM/xn0QAIAD6YBhwB4nI1Ty07cMBS9QwKlQapQW3VXySvEqDCZGbGaHULiIQ1FKgjWMxknMfLEke2A+IJu+wntrt/QbVf9gG75jK577Lg8K1qQPCfnnnt8fX1NRC/pmjrk/zprC+8D7tBy9DHgBXoWfQ44Av8t4Bj4Z8CLtBL9CniJluPXASf0Lm4CXqFX8Q84dOLnMB17N4c7tBo1AS/Qi+hTwBH4rwHHwN8DXqQ30XXAS7QaLwSc0Gn8NuAVWou/gFmnjLrEaEh9GmDdDGgL3B4JsrRPDU2hTOiMSuJUIdKQQayiAth69r6akSSFqIJuA19TrzCIaY8sIoxyrNIrL//pw7A2iMygkX5vDj+G+kuoLdX4GlGK/8Lnlz6/h9MpmoO9rafrz7ILXEHHaAx95s9lsI7AHNMBWEZHULnfAXwG9/ZqdzLI08iuwRloXE8kfhXYAvE23+23DU3t626rbs8/8adv+9DWknsHp3E17oCf+Z48rvEQNZ78paYM38qfk3v/u3l3u3GXN2Dmvmvpf1Srwk3pB/VSsp512bA/GG5i2WJ7wu430yQ5K3nFGiOqgtmSB5pJVSizwaacmUZzZhXLlZTq8qGGFY2YcSkqbth6aW1tRmlaCFs2016m5qn36SbJrqosG4uMV4aP2PHBmB3tjtmgN2izkGQyLWprekbIntJFing32a5rKWCN/SdSoga45EJykyQ7asZvHQ8PTm6cslIpwyeyjbVltNikc2HTR7YKh9LBl9DADC0U/jLcBZDKrMhUBfQBvXRzLtFtjU9eNHKin0x5InTqb8lNpfKv1s1xHzTXRqgKzek/mb7nB8RZTCDhGEX3kK/8Q75AmUM/eLkfA+0Hi908Kx4eNsMgudg5GLdRD7a84npi+YxNr5i5KIbW5izXas7cHXIMAau1OueZhfj+cOcP3P8MNIWLyYOBuxL6DRylJ4cAAAB4nGNgYoAALjDJyIAOWMCiTIxMLDmZedkABtIBygAAAA==) format('woff');
-}
-
-.markdown-body {
-  -ms-text-size-adjust: 100%;
-  -webkit-text-size-adjust: 100%;
-  color: #333;
-  overflow: hidden;
-  font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif;
-  font-size: 16px;
-  line-height: 1.6;
-  word-wrap: break-word;
-}
-
-.markdown-body a {
-  background: transparent;
-}
-
-.markdown-body a:active,
-.markdown-body a:hover {
-  outline: 0;
-}
-
-.markdown-body strong {
-  font-weight: bold;
-}
-
-.markdown-body h1 {
-  font-size: 2em;
-  margin: 0.67em 0;
-}
-
-.markdown-body img {
-  border: 0;
-}
-
-.markdown-body hr {
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-  height: 0;
-}
-
-.markdown-body pre {
-  overflow: auto;
-}
-
-.markdown-body code,
-.markdown-body kbd,
-.markdown-body pre {
-  font-family: monospace, monospace;
-  font-size: 1em;
-}
-
-.markdown-body input {
-  color: inherit;
-  font: inherit;
-  margin: 0;
-}
-
-.markdown-body html input[disabled] {
-  cursor: default;
-}
-
-.markdown-body input {
-  line-height: normal;
-}
-
-.markdown-body input[type="checkbox"] {
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  padding: 0;
-}
-
-.markdown-body table {
-  border-collapse: collapse;
-  border-spacing: 0;
-}
-
-.markdown-body td,
-.markdown-body th {
-  padding: 0;
-}
-
-.markdown-body * {
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-
-.markdown-body input {
-  font: 13px/1.4 Helvetica, arial, freesans, clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol";
-}
-
-.markdown-body a {
-  color: #4183c4;
-  text-decoration: none;
-}
-
-.markdown-body a:hover,
-.markdown-body a:focus,
-.markdown-body a:active {
-  text-decoration: underline;
-}
-
-.markdown-body hr {
-  height: 0;
-  margin: 15px 0;
-  overflow: hidden;
-  background: transparent;
-  border: 0;
-  border-bottom: 1px solid #ddd;
-}
-
-.markdown-body hr:before {
-  display: table;
-  content: "";
-}
-
-.markdown-body hr:after {
-  display: table;
-  clear: both;
-  content: "";
-}
-
-.markdown-body h1,
-.markdown-body h2,
-.markdown-body h3,
-.markdown-body h4,
-.markdown-body h5,
-.markdown-body h6 {
-  margin-top: 15px;
-  margin-bottom: 15px;
-  line-height: 1.1;
-}
-
-.markdown-body h1 {
-  font-size: 30px;
-}
-
-.markdown-body h2 {
-  font-size: 21px;
-}
-
-.markdown-body h3 {
-  font-size: 16px;
-}
-
-.markdown-body h4 {
-  font-size: 14px;
-}
-
-.markdown-body h5 {
-  font-size: 12px;
-}
-
-.markdown-body h6 {
-  font-size: 11px;
-}
-
-.markdown-body blockquote {
-  margin: 0;
-}
-
-.markdown-body ul,
-.markdown-body ol {
-  padding: 0;
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-.markdown-body ol ol,
-.markdown-body ul ol {
-  list-style-type: lower-roman;
-}
-
-.markdown-body ul ul ol,
-.markdown-body ul ol ol,
-.markdown-body ol ul ol,
-.markdown-body ol ol ol {
-  list-style-type: lower-alpha;
-}
-
-.markdown-body dd {
-  margin-left: 0;
-}
-
-.markdown-body code {
-  font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace;
-}
-
-.markdown-body pre {
-  margin-top: 0;
-  margin-bottom: 0;
-  font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace;
-}
-
-.markdown-body .octicon {
-  font: normal normal 16px octicons-anchor;
-  line-height: 1;
-  display: inline-block;
-  text-decoration: none;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-
-.markdown-body .octicon-link:before {
-  content: '\f05c';
-}
-
-.markdown-body>*:first-child {
-  margin-top: 0 !important;
-}
-
-.markdown-body>*:last-child {
-  margin-bottom: 0 !important;
-}
-
-.markdown-body .anchor {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  display: block;
-  padding-right: 6px;
-  padding-left: 30px;
-  margin-left: -30px;
-}
-
-.markdown-body .anchor:focus {
-  outline: none;
-}
-
-.markdown-body h1,
-.markdown-body h2,
-.markdown-body h3,
-.markdown-body h4,
-.markdown-body h5,
-.markdown-body h6 {
-  position: relative;
-  margin-top: 1em;
-  margin-bottom: 16px;
-  font-weight: bold;
-  line-height: 1.4;
-}
-
-.markdown-body h1 .octicon-link,
-.markdown-body h2 .octicon-link,
-.markdown-body h3 .octicon-link,
-.markdown-body h4 .octicon-link,
-.markdown-body h5 .octicon-link,
-.markdown-body h6 .octicon-link {
-  display: none;
-  color: #000;
-  vertical-align: middle;
-}
-
-.markdown-body h1:hover .anchor,
-.markdown-body h2:hover .anchor,
-.markdown-body h3:hover .anchor,
-.markdown-body h4:hover .anchor,
-.markdown-body h5:hover .anchor,
-.markdown-body h6:hover .anchor {
-  padding-left: 8px;
-  margin-left: -30px;
-  line-height: 1;
-  text-decoration: none;
-}
-
-.markdown-body h1:hover .anchor .octicon-link,
-.markdown-body h2:hover .anchor .octicon-link,
-.markdown-body h3:hover .anchor .octicon-link,
-.markdown-body h4:hover .anchor .octicon-link,
-.markdown-body h5:hover .anchor .octicon-link,
-.markdown-body h6:hover .anchor .octicon-link {
-  display: inline-block;
-}
-
-.markdown-body h1 {
-  padding-bottom: 0.3em;
-  font-size: 2.25em;
-  line-height: 1.2;
-  border-bottom: 1px solid #eee;
-}
-
-.markdown-body h2 {
-  padding-bottom: 0.3em;
-  font-size: 1.75em;
-  line-height: 1.225;
-  border-bottom: 1px solid #eee;
-}
-
-.markdown-body h3 {
-  font-size: 1.5em;
-  line-height: 1.43;
-}
-
-.markdown-body h4 {
-  font-size: 1.25em;
-}
-
-.markdown-body h5 {
-  font-size: 1em;
-}
-
-.markdown-body h6 {
-  font-size: 1em;
-  color: #777;
-}
-
-.markdown-body p,
-.markdown-body blockquote,
-.markdown-body ul,
-.markdown-body ol,
-.markdown-body dl,
-.markdown-body table,
-.markdown-body pre {
-  margin-top: 0;
-  margin-bottom: 16px;
-}
-
-.markdown-body hr {
-  height: 4px;
-  padding: 0;
-  margin: 16px 0;
-  background-color: #e7e7e7;
-  border: 0 none;
-}
-
-.markdown-body ul,
-.markdown-body ol {
-  padding-left: 2em;
-}
-
-.markdown-body ul ul,
-.markdown-body ul ol,
-.markdown-body ol ol,
-.markdown-body ol ul {
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-.markdown-body li>p {
-  margin-top: 16px;
-}
-
-.markdown-body dl {
-  padding: 0;
-}
-
-.markdown-body dl dt {
-  padding: 0;
-  margin-top: 16px;
-  font-size: 1em;
-  font-style: italic;
-  font-weight: bold;
-}
-
-.markdown-body dl dd {
-  padding: 0 16px;
-  margin-bottom: 16px;
-}
-
-.markdown-body blockquote {
-  padding: 0 15px;
-  color: #777;
-  border-left: 4px solid #ddd;
-}
-
-.markdown-body blockquote>:first-child {
-  margin-top: 0;
-}
-
-.markdown-body blockquote>:last-child {
-  margin-bottom: 0;
-}
-
-.markdown-body table {
-  display: block;
-  width: 100%;
-  overflow: auto;
-  word-break: normal;
-  word-break: keep-all;
-}
-
-.markdown-body table th {
-  font-weight: bold;
-}
-
-.markdown-body table th,
-.markdown-body table td {
-  padding: 6px 13px;
-  border: 1px solid #ddd;
-}
-
-.markdown-body table tr {
-  background-color: #fff;
-  border-top: 1px solid #ccc;
-}
-
-.markdown-body table tr:nth-child(2n) {
-  background-color: #f8f8f8;
-}
-
-.markdown-body img {
-  max-width: 100%;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-
-.markdown-body code {
-  padding: 0;
-  padding-top: 0.2em;
-  padding-bottom: 0.2em;
-  margin: 0;
-  font-size: 85%;
-  background-color: rgba(0,0,0,0.04);
-  border-radius: 3px;
-}
-
-.markdown-body code:before,
-.markdown-body code:after {
-  letter-spacing: -0.2em;
-  content: "\00a0";
-}
-
-.markdown-body pre>code {
-  padding: 0;
-  margin: 0;
-  font-size: 100%;
-  word-break: normal;
-  white-space: pre;
-  background: transparent;
-  border: 0;
-}
-
-.markdown-body .highlight {
-  margin-bottom: 16px;
-}
-
-.markdown-body .highlight pre,
-.markdown-body pre {
-  padding: 16px;
-  overflow: auto;
-  font-size: 85%;
-  line-height: 1.45;
-  background-color: #f7f7f7;
-  border-radius: 3px;
-}
-
-.markdown-body .highlight pre {
-  margin-bottom: 0;
-  word-break: normal;
-}
-
-.markdown-body pre {
-  word-wrap: normal;
-}
-
-.markdown-body pre code {
-  display: inline;
-  max-width: initial;
-  padding: 0;
-  margin: 0;
-  overflow: initial;
-  line-height: inherit;
-  word-wrap: normal;
-  background-color: transparent;
-  border: 0;
-}
-
-.markdown-body pre code:before,
-.markdown-body pre code:after {
-  content: normal;
-}
-
-.markdown-body .highlight {
-  background: #fff;
-}
-
-.markdown-body .highlight .h {
-  color: #333;
-  font-style: normal;
-  font-weight: normal;
-}
-
-.markdown-body .highlight .mf,
-.markdown-body .highlight .mh,
-.markdown-body .highlight .mi,
-.markdown-body .highlight .mo,
-.markdown-body .highlight .il,
-.markdown-body .highlight .m {
-  color: #945277;
-}
-
-.markdown-body .highlight .s,
-.markdown-body .highlight .sb,
-.markdown-body .highlight .sc,
-.markdown-body .highlight .sd,
-.markdown-body .highlight .s2,
-.markdown-body .highlight .se,
-.markdown-body .highlight .sh,
-.markdown-body .highlight .si,
-.markdown-body .highlight .sx,
-.markdown-body .highlight .s1 {
-  color: #df5000;
-}
-
-.markdown-body .highlight .kc,
-.markdown-body .highlight .kd,
-.markdown-body .highlight .kn,
-.markdown-body .highlight .kp,
-.markdown-body .highlight .kr,
-.markdown-body .highlight .kt,
-.markdown-body .highlight .k,
-.markdown-body .highlight .o {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .kt {
-  color: #458;
-}
-
-.markdown-body .highlight .c,
-.markdown-body .highlight .cm,
-.markdown-body .highlight .c1 {
-  color: #998;
-  font-style: italic;
-}
-
-.markdown-body .highlight .cp,
-.markdown-body .highlight .cs,
-.markdown-body .highlight .cp .h {
-  color: #999;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .cs {
-  font-style: italic;
-}
-
-.markdown-body .highlight .n {
-  color: #333;
-}
-
-.markdown-body .highlight .na,
-.markdown-body .highlight .nv,
-.markdown-body .highlight .vc,
-.markdown-body .highlight .vg,
-.markdown-body .highlight .vi {
-  color: #008080;
-}
-
-.markdown-body .highlight .nb {
-  color: #0086B3;
-}
-
-.markdown-body .highlight .nc {
-  color: #458;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .no {
-  color: #094e99;
-}
-
-.markdown-body .highlight .ni {
-  color: #800080;
-}
-
-.markdown-body .highlight .ne {
-  color: #990000;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .nf {
-  color: #945277;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .nn {
-  color: #555;
-}
-
-.markdown-body .highlight .nt {
-  color: #000080;
-}
-
-.markdown-body .highlight .err {
-  color: #a61717;
-  background-color: #e3d2d2;
-}
-
-.markdown-body .highlight .gd {
-  color: #000;
-  background-color: #fdd;
-}
-
-.markdown-body .highlight .gd .x {
-  color: #000;
-  background-color: #faa;
-}
-
-.markdown-body .highlight .ge {
-  font-style: italic;
-}
-
-.markdown-body .highlight .gr {
-  color: #aa0000;
-}
-
-.markdown-body .highlight .gh {
-  color: #999;
-}
-
-.markdown-body .highlight .gi {
-  color: #000;
-  background-color: #dfd;
-}
-
-.markdown-body .highlight .gi .x {
-  color: #000;
-  background-color: #afa;
-}
-
-.markdown-body .highlight .go {
-  color: #888;
-}
-
-.markdown-body .highlight .gp {
-  color: #555;
-}
-
-.markdown-body .highlight .gs {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .gu {
-  color: #800080;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .gt {
-  color: #aa0000;
-}
-
-.markdown-body .highlight .ow {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .w {
-  color: #bbb;
-}
-
-.markdown-body .highlight .sr {
-  color: #017936;
-}
-
-.markdown-body .highlight .ss {
-  color: #8b467f;
-}
-
-.markdown-body .highlight .bp {
-  color: #999;
-}
-
-.markdown-body .highlight .gc {
-  color: #999;
-  background-color: #EAF2F5;
-}
-
-.markdown-body kbd {
-  background-color: #e7e7e7;
-  background-image: -webkit-linear-gradient(#fefefe, #e7e7e7);
-  background-image: linear-gradient(#fefefe, #e7e7e7);
-  background-repeat: repeat-x;
-  display: inline-block;
-  padding: 3px 5px;
-  font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace;
-  line-height: 10px;
-  color: #000;
-  border: 1px solid #cfcfcf;
-  border-radius: 2px;
-}
-
-.markdown-body .highlight .pl-coc,
-.markdown-body .highlight .pl-entm,
-.markdown-body .highlight .pl-eoa,
-.markdown-body .highlight .pl-mai .pl-sf,
-.markdown-body .highlight .pl-pdv,
-.markdown-body .highlight .pl-sc,
-.markdown-body .highlight .pl-sr,
-.markdown-body .highlight .pl-v,
-.markdown-body .highlight .pl-vpf {
-  color: #0086b3;
-}
-
-.markdown-body .highlight .pl-eoac,
-.markdown-body .highlight .pl-mdht,
-.markdown-body .highlight .pl-mi1,
-.markdown-body .highlight .pl-mri,
-.markdown-body .highlight .pl-va,
-.markdown-body .highlight .pl-vpu {
-  color: #008080;
-}
-
-.markdown-body .highlight .pl-c,
-.markdown-body .highlight .pl-pdc {
-  color: #b4b7b4;
-  font-style: italic;
-}
-
-.markdown-body .highlight .pl-k,
-.markdown-body .highlight .pl-ko,
-.markdown-body .highlight .pl-kolp,
-.markdown-body .highlight .pl-mc,
-.markdown-body .highlight .pl-mr,
-.markdown-body .highlight .pl-ms,
-.markdown-body .highlight .pl-s,
-.markdown-body .highlight .pl-sok,
-.markdown-body .highlight .pl-st {
-  color: #6e5494;
-}
-
-.markdown-body .highlight .pl-ef,
-.markdown-body .highlight .pl-enf,
-.markdown-body .highlight .pl-enm,
-.markdown-body .highlight .pl-entc,
-.markdown-body .highlight .pl-eoi,
-.markdown-body .highlight .pl-sf,
-.markdown-body .highlight .pl-smc {
-  color: #d12089;
-}
-
-.markdown-body .highlight .pl-ens,
-.markdown-body .highlight .pl-eoai,
-.markdown-body .highlight .pl-kos,
-.markdown-body .highlight .pl-mh .pl-pdh,
-.markdown-body .highlight .pl-mp,
-.markdown-body .highlight .pl-pde,
-.markdown-body .highlight .pl-stp {
-  color: #458;
-}
-
-.markdown-body .highlight .pl-enti {
-  color: #d12089;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-cce,
-.markdown-body .highlight .pl-enc,
-.markdown-body .highlight .pl-kou,
-.markdown-body .highlight .pl-mq {
-  color: #f93;
-}
-
-.markdown-body .highlight .pl-mp1 .pl-sf {
-  color: #458;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-cos,
-.markdown-body .highlight .pl-ent,
-.markdown-body .highlight .pl-md,
-.markdown-body .highlight .pl-mdhf,
-.markdown-body .highlight .pl-ml,
-.markdown-body .highlight .pl-pdc1,
-.markdown-body .highlight .pl-pds,
-.markdown-body .highlight .pl-s1,
-.markdown-body .highlight .pl-scp,
-.markdown-body .highlight .pl-sol {
-  color: #df5000;
-}
-
-.markdown-body .highlight .pl-c1,
-.markdown-body .highlight .pl-cn,
-.markdown-body .highlight .pl-pse,
-.markdown-body .highlight .pl-pse .pl-s2,
-.markdown-body .highlight .pl-vi {
-  color: #a31515;
-}
-
-.markdown-body .highlight .pl-mb,
-.markdown-body .highlight .pl-pdb {
-  color: #df5000;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-mi,
-.markdown-body .highlight .pl-pdi {
-  color: #6e5494;
-  font-style: italic;
-}
-
-.markdown-body .highlight .pl-ms1 {
-  background-color: #f5f5f5;
-}
-
-.markdown-body .highlight .pl-mdh,
-.markdown-body .highlight .pl-mdi {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-mdr {
-  color: #0086b3;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-s2 {
-  color: #333;
-}
-
-.markdown-body .highlight .pl-ii {
-  background-color: #df5000;
-  color: #fff;
-}
-
-.markdown-body .highlight .pl-ib {
-  background-color: #f93;
-}
-
-.markdown-body .highlight .pl-id {
-  background-color: #a31515;
-  color: #fff;
-}
-
-.markdown-body .highlight .pl-iu {
-  background-color: #b4b7b4;
-}
-
-.markdown-body .highlight .pl-mo {
-  color: #969896;
-}
-
-.markdown-body .task-list-item {
-  list-style-type: none;
-}
-
-.markdown-body .task-list-item+.task-list-item {
-  margin-top: 3px;
-}
-
-.markdown-body .task-list-item input {
-  float: left;
-  margin: 0.3em 0 0.25em -1.6em;
-  vertical-align: middle;
-}</style><title>troubleshooting</title></head><body><article class="markdown-body"><h1 id="troubleshooting">
-<a id="user-content-troubleshooting" class="anchor" href="#troubleshooting" aria-hidden="true"><span class="octicon octicon-link"></span></a>Troubleshooting</h1>
-
-<h2 id="i-get-the-error-class-kohana_tests-could-not-be-found-when-testing-from-the-cli">
-<a id="user-content-i-get-the-error-class-kohana_tests-could-not-be-found-when-testing-from-the-cli" class="anchor" href="#i-get-the-error-class-kohana_tests-could-not-be-found-when-testing-from-the-cli" aria-hidden="true"><span class="octicon octicon-link"></span></a>I get the error "Class Kohana_Tests could not be found" when testing from the CLI</h2>
-
-<p>You need to running PHPUnit &gt;= 3.4, there is a bug in 3.3 which causes this.</p>
-
-<h2 id="some-of-my-classes-arent-getting-whitelisted-for-code-coverage-even-though-their-module-is">
-<a id="user-content-some-of-my-classes-arent-getting-whitelisted-for-code-coverage-even-though-their-module-is" class="anchor" href="#some-of-my-classes-arent-getting-whitelisted-for-code-coverage-even-though-their-module-is" aria-hidden="true"><span class="octicon octicon-link"></span></a>Some of my classes aren't getting whitelisted for code coverage even though their module is</h2>
-
-<p>Only the "highest" files in the cascading filesystem are whitelisted for code coverage.</p>
-
-<p>To test your module's file, remove the higher file from the cascading filesystem by disabling their respective module.</p>
-
-<p>A good way of testing is to create a "vanilla" testing environment for your module, devoid of anything that isn't required by the module.</p>
-
-<h2 id="i-get-a-blank-page-when-trying-to-generate-a-code-coverage-report">
-<a id="user-content-i-get-a-blank-page-when-trying-to-generate-a-code-coverage-report" class="anchor" href="#i-get-a-blank-page-when-trying-to-generate-a-code-coverage-report" aria-hidden="true"><span class="octicon octicon-link"></span></a>I get a blank page when trying to generate a code coverage report</h2>
-
-<p>Try the following:</p>
-
-<ol>
-<li>Generate a html report from the command line using <code>phpunit {bootstrap info} --coverage-html ./report {insert path to tests.php}</code>.  If any error messages show up, fix them and try to generate the report again</li>
-<li>Increase the php memory limit</li>
-<li>Make sure that display_errors is set to "on" in your php.ini config file (this value can sometimes be overriden in a .htaccess file)</li>
-</ol>
-</article></body></html>
\ No newline at end of file
diff --git a/doc/dev/testing/kohana/troubleshooting.md b/doc/dev/testing/kohana/troubleshooting.md
deleted file mode 100644
index 774640e01f94d320b877ba05cec0ba0515343346..0000000000000000000000000000000000000000
--- a/doc/dev/testing/kohana/troubleshooting.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Troubleshooting
-
-## I get the error "Class Kohana_Tests could not be found" when testing from the CLI
-
-You need to running PHPUnit >= 3.4, there is a bug in 3.3 which causes this.
-
-## Some of my classes aren't getting whitelisted for code coverage even though their module is
-
-Only the "highest" files in the cascading filesystem are whitelisted for code coverage.
-
-To test your module's file, remove the higher file from the cascading filesystem by disabling their respective module.
-
-A good way of testing is to create a "vanilla" testing environment for your module, devoid of anything that isn't required by the module.
-
-## I get a blank page when trying to generate a code coverage report
-
-Try the following:
-
-1. Generate a html report from the command line using `phpunit {bootstrap info} --coverage-html ./report {insert path to tests.php}`.  If any error messages show up, fix them and try to generate the report again
-2. Increase the php memory limit
-3. Make sure that display_errors is set to "on" in your php.ini config file (this value can sometimes be overriden in a .htaccess file)
diff --git a/doc/dev/testing/kohana/usage.html b/doc/dev/testing/kohana/usage.html
deleted file mode 100644
index 1afb7ff33a2d0b7e8c2cdcffca84f8b51666579e..0000000000000000000000000000000000000000
--- a/doc/dev/testing/kohana/usage.html
+++ /dev/null
@@ -1,994 +0,0 @@
-<!DOCTYPE html><html><head><meta charset="utf-8"><style>body {
-  width: 45em;
-  border: 1px solid #ddd;
-  outline: 1300px solid #fff;
-  margin: 16px auto;
-}
-
-body .markdown-body
-{
-  padding: 30px;
-}
-
-@font-face {
-  font-family: octicons-anchor;
-  src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAYcAA0AAAAACjQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABMAAAABwAAAAca8vGTk9TLzIAAAFMAAAARAAAAFZG1VHVY21hcAAAAZAAAAA+AAABQgAP9AdjdnQgAAAB0AAAAAQAAAAEACICiGdhc3AAAAHUAAAACAAAAAj//wADZ2x5ZgAAAdwAAADRAAABEKyikaNoZWFkAAACsAAAAC0AAAA2AtXoA2hoZWEAAALgAAAAHAAAACQHngNFaG10eAAAAvwAAAAQAAAAEAwAACJsb2NhAAADDAAAAAoAAAAKALIAVG1heHAAAAMYAAAAHwAAACABEAB2bmFtZQAAAzgAAALBAAAFu3I9x/Nwb3N0AAAF/AAAAB0AAAAvaoFvbwAAAAEAAAAAzBdyYwAAAADP2IQvAAAAAM/bz7t4nGNgZGFgnMDAysDB1Ml0hoGBoR9CM75mMGLkYGBgYmBlZsAKAtJcUxgcPsR8iGF2+O/AEMPsznAYKMwIkgMA5REMOXicY2BgYGaAYBkGRgYQsAHyGMF8FgYFIM0ChED+h5j//yEk/3KoSgZGNgYYk4GRCUgwMaACRoZhDwCs7QgGAAAAIgKIAAAAAf//AAJ4nHWMMQrCQBBF/0zWrCCIKUQsTDCL2EXMohYGSSmorScInsRGL2DOYJe0Ntp7BK+gJ1BxF1stZvjz/v8DRghQzEc4kIgKwiAppcA9LtzKLSkdNhKFY3HF4lK69ExKslx7Xa+vPRVS43G98vG1DnkDMIBUgFN0MDXflU8tbaZOUkXUH0+U27RoRpOIyCKjbMCVejwypzJJG4jIwb43rfl6wbwanocrJm9XFYfskuVC5K/TPyczNU7b84CXcbxks1Un6H6tLH9vf2LRnn8Ax7A5WQAAAHicY2BkYGAA4teL1+yI57f5ysDNwgAC529f0kOmWRiYVgEpDgYmEA8AUzEKsQAAAHicY2BkYGB2+O/AEMPCAAJAkpEBFbAAADgKAe0EAAAiAAAAAAQAAAAEAAAAAAAAKgAqACoAiAAAeJxjYGRgYGBhsGFgYgABEMkFhAwM/xn0QAIAD6YBhwB4nI1Ty07cMBS9QwKlQapQW3VXySvEqDCZGbGaHULiIQ1FKgjWMxknMfLEke2A+IJu+wntrt/QbVf9gG75jK577Lg8K1qQPCfnnnt8fX1NRC/pmjrk/zprC+8D7tBy9DHgBXoWfQ44Av8t4Bj4Z8CLtBL9CniJluPXASf0Lm4CXqFX8Q84dOLnMB17N4c7tBo1AS/Qi+hTwBH4rwHHwN8DXqQ30XXAS7QaLwSc0Gn8NuAVWou/gFmnjLrEaEh9GmDdDGgL3B4JsrRPDU2hTOiMSuJUIdKQQayiAth69r6akSSFqIJuA19TrzCIaY8sIoxyrNIrL//pw7A2iMygkX5vDj+G+kuoLdX4GlGK/8Lnlz6/h9MpmoO9rafrz7ILXEHHaAx95s9lsI7AHNMBWEZHULnfAXwG9/ZqdzLI08iuwRloXE8kfhXYAvE23+23DU3t626rbs8/8adv+9DWknsHp3E17oCf+Z48rvEQNZ78paYM38qfk3v/u3l3u3GXN2Dmvmvpf1Srwk3pB/VSsp512bA/GG5i2WJ7wu430yQ5K3nFGiOqgtmSB5pJVSizwaacmUZzZhXLlZTq8qGGFY2YcSkqbth6aW1tRmlaCFs2016m5qn36SbJrqosG4uMV4aP2PHBmB3tjtmgN2izkGQyLWprekbIntJFing32a5rKWCN/SdSoga45EJykyQ7asZvHQ8PTm6cslIpwyeyjbVltNikc2HTR7YKh9LBl9DADC0U/jLcBZDKrMhUBfQBvXRzLtFtjU9eNHKin0x5InTqb8lNpfKv1s1xHzTXRqgKzek/mb7nB8RZTCDhGEX3kK/8Q75AmUM/eLkfA+0Hi908Kx4eNsMgudg5GLdRD7a84npi+YxNr5i5KIbW5izXas7cHXIMAau1OueZhfj+cOcP3P8MNIWLyYOBuxL6DRylJ4cAAAB4nGNgYoAALjDJyIAOWMCiTIxMLDmZedkABtIBygAAAA==) format('woff');
-}
-
-.markdown-body {
-  -ms-text-size-adjust: 100%;
-  -webkit-text-size-adjust: 100%;
-  color: #333;
-  overflow: hidden;
-  font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif;
-  font-size: 16px;
-  line-height: 1.6;
-  word-wrap: break-word;
-}
-
-.markdown-body a {
-  background: transparent;
-}
-
-.markdown-body a:active,
-.markdown-body a:hover {
-  outline: 0;
-}
-
-.markdown-body strong {
-  font-weight: bold;
-}
-
-.markdown-body h1 {
-  font-size: 2em;
-  margin: 0.67em 0;
-}
-
-.markdown-body img {
-  border: 0;
-}
-
-.markdown-body hr {
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-  height: 0;
-}
-
-.markdown-body pre {
-  overflow: auto;
-}
-
-.markdown-body code,
-.markdown-body kbd,
-.markdown-body pre {
-  font-family: monospace, monospace;
-  font-size: 1em;
-}
-
-.markdown-body input {
-  color: inherit;
-  font: inherit;
-  margin: 0;
-}
-
-.markdown-body html input[disabled] {
-  cursor: default;
-}
-
-.markdown-body input {
-  line-height: normal;
-}
-
-.markdown-body input[type="checkbox"] {
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  padding: 0;
-}
-
-.markdown-body table {
-  border-collapse: collapse;
-  border-spacing: 0;
-}
-
-.markdown-body td,
-.markdown-body th {
-  padding: 0;
-}
-
-.markdown-body * {
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-
-.markdown-body input {
-  font: 13px/1.4 Helvetica, arial, freesans, clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol";
-}
-
-.markdown-body a {
-  color: #4183c4;
-  text-decoration: none;
-}
-
-.markdown-body a:hover,
-.markdown-body a:focus,
-.markdown-body a:active {
-  text-decoration: underline;
-}
-
-.markdown-body hr {
-  height: 0;
-  margin: 15px 0;
-  overflow: hidden;
-  background: transparent;
-  border: 0;
-  border-bottom: 1px solid #ddd;
-}
-
-.markdown-body hr:before {
-  display: table;
-  content: "";
-}
-
-.markdown-body hr:after {
-  display: table;
-  clear: both;
-  content: "";
-}
-
-.markdown-body h1,
-.markdown-body h2,
-.markdown-body h3,
-.markdown-body h4,
-.markdown-body h5,
-.markdown-body h6 {
-  margin-top: 15px;
-  margin-bottom: 15px;
-  line-height: 1.1;
-}
-
-.markdown-body h1 {
-  font-size: 30px;
-}
-
-.markdown-body h2 {
-  font-size: 21px;
-}
-
-.markdown-body h3 {
-  font-size: 16px;
-}
-
-.markdown-body h4 {
-  font-size: 14px;
-}
-
-.markdown-body h5 {
-  font-size: 12px;
-}
-
-.markdown-body h6 {
-  font-size: 11px;
-}
-
-.markdown-body blockquote {
-  margin: 0;
-}
-
-.markdown-body ul,
-.markdown-body ol {
-  padding: 0;
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-.markdown-body ol ol,
-.markdown-body ul ol {
-  list-style-type: lower-roman;
-}
-
-.markdown-body ul ul ol,
-.markdown-body ul ol ol,
-.markdown-body ol ul ol,
-.markdown-body ol ol ol {
-  list-style-type: lower-alpha;
-}
-
-.markdown-body dd {
-  margin-left: 0;
-}
-
-.markdown-body code {
-  font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace;
-}
-
-.markdown-body pre {
-  margin-top: 0;
-  margin-bottom: 0;
-  font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace;
-}
-
-.markdown-body .octicon {
-  font: normal normal 16px octicons-anchor;
-  line-height: 1;
-  display: inline-block;
-  text-decoration: none;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-
-.markdown-body .octicon-link:before {
-  content: '\f05c';
-}
-
-.markdown-body>*:first-child {
-  margin-top: 0 !important;
-}
-
-.markdown-body>*:last-child {
-  margin-bottom: 0 !important;
-}
-
-.markdown-body .anchor {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  display: block;
-  padding-right: 6px;
-  padding-left: 30px;
-  margin-left: -30px;
-}
-
-.markdown-body .anchor:focus {
-  outline: none;
-}
-
-.markdown-body h1,
-.markdown-body h2,
-.markdown-body h3,
-.markdown-body h4,
-.markdown-body h5,
-.markdown-body h6 {
-  position: relative;
-  margin-top: 1em;
-  margin-bottom: 16px;
-  font-weight: bold;
-  line-height: 1.4;
-}
-
-.markdown-body h1 .octicon-link,
-.markdown-body h2 .octicon-link,
-.markdown-body h3 .octicon-link,
-.markdown-body h4 .octicon-link,
-.markdown-body h5 .octicon-link,
-.markdown-body h6 .octicon-link {
-  display: none;
-  color: #000;
-  vertical-align: middle;
-}
-
-.markdown-body h1:hover .anchor,
-.markdown-body h2:hover .anchor,
-.markdown-body h3:hover .anchor,
-.markdown-body h4:hover .anchor,
-.markdown-body h5:hover .anchor,
-.markdown-body h6:hover .anchor {
-  padding-left: 8px;
-  margin-left: -30px;
-  line-height: 1;
-  text-decoration: none;
-}
-
-.markdown-body h1:hover .anchor .octicon-link,
-.markdown-body h2:hover .anchor .octicon-link,
-.markdown-body h3:hover .anchor .octicon-link,
-.markdown-body h4:hover .anchor .octicon-link,
-.markdown-body h5:hover .anchor .octicon-link,
-.markdown-body h6:hover .anchor .octicon-link {
-  display: inline-block;
-}
-
-.markdown-body h1 {
-  padding-bottom: 0.3em;
-  font-size: 2.25em;
-  line-height: 1.2;
-  border-bottom: 1px solid #eee;
-}
-
-.markdown-body h2 {
-  padding-bottom: 0.3em;
-  font-size: 1.75em;
-  line-height: 1.225;
-  border-bottom: 1px solid #eee;
-}
-
-.markdown-body h3 {
-  font-size: 1.5em;
-  line-height: 1.43;
-}
-
-.markdown-body h4 {
-  font-size: 1.25em;
-}
-
-.markdown-body h5 {
-  font-size: 1em;
-}
-
-.markdown-body h6 {
-  font-size: 1em;
-  color: #777;
-}
-
-.markdown-body p,
-.markdown-body blockquote,
-.markdown-body ul,
-.markdown-body ol,
-.markdown-body dl,
-.markdown-body table,
-.markdown-body pre {
-  margin-top: 0;
-  margin-bottom: 16px;
-}
-
-.markdown-body hr {
-  height: 4px;
-  padding: 0;
-  margin: 16px 0;
-  background-color: #e7e7e7;
-  border: 0 none;
-}
-
-.markdown-body ul,
-.markdown-body ol {
-  padding-left: 2em;
-}
-
-.markdown-body ul ul,
-.markdown-body ul ol,
-.markdown-body ol ol,
-.markdown-body ol ul {
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-.markdown-body li>p {
-  margin-top: 16px;
-}
-
-.markdown-body dl {
-  padding: 0;
-}
-
-.markdown-body dl dt {
-  padding: 0;
-  margin-top: 16px;
-  font-size: 1em;
-  font-style: italic;
-  font-weight: bold;
-}
-
-.markdown-body dl dd {
-  padding: 0 16px;
-  margin-bottom: 16px;
-}
-
-.markdown-body blockquote {
-  padding: 0 15px;
-  color: #777;
-  border-left: 4px solid #ddd;
-}
-
-.markdown-body blockquote>:first-child {
-  margin-top: 0;
-}
-
-.markdown-body blockquote>:last-child {
-  margin-bottom: 0;
-}
-
-.markdown-body table {
-  display: block;
-  width: 100%;
-  overflow: auto;
-  word-break: normal;
-  word-break: keep-all;
-}
-
-.markdown-body table th {
-  font-weight: bold;
-}
-
-.markdown-body table th,
-.markdown-body table td {
-  padding: 6px 13px;
-  border: 1px solid #ddd;
-}
-
-.markdown-body table tr {
-  background-color: #fff;
-  border-top: 1px solid #ccc;
-}
-
-.markdown-body table tr:nth-child(2n) {
-  background-color: #f8f8f8;
-}
-
-.markdown-body img {
-  max-width: 100%;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-
-.markdown-body code {
-  padding: 0;
-  padding-top: 0.2em;
-  padding-bottom: 0.2em;
-  margin: 0;
-  font-size: 85%;
-  background-color: rgba(0,0,0,0.04);
-  border-radius: 3px;
-}
-
-.markdown-body code:before,
-.markdown-body code:after {
-  letter-spacing: -0.2em;
-  content: "\00a0";
-}
-
-.markdown-body pre>code {
-  padding: 0;
-  margin: 0;
-  font-size: 100%;
-  word-break: normal;
-  white-space: pre;
-  background: transparent;
-  border: 0;
-}
-
-.markdown-body .highlight {
-  margin-bottom: 16px;
-}
-
-.markdown-body .highlight pre,
-.markdown-body pre {
-  padding: 16px;
-  overflow: auto;
-  font-size: 85%;
-  line-height: 1.45;
-  background-color: #f7f7f7;
-  border-radius: 3px;
-}
-
-.markdown-body .highlight pre {
-  margin-bottom: 0;
-  word-break: normal;
-}
-
-.markdown-body pre {
-  word-wrap: normal;
-}
-
-.markdown-body pre code {
-  display: inline;
-  max-width: initial;
-  padding: 0;
-  margin: 0;
-  overflow: initial;
-  line-height: inherit;
-  word-wrap: normal;
-  background-color: transparent;
-  border: 0;
-}
-
-.markdown-body pre code:before,
-.markdown-body pre code:after {
-  content: normal;
-}
-
-.markdown-body .highlight {
-  background: #fff;
-}
-
-.markdown-body .highlight .h {
-  color: #333;
-  font-style: normal;
-  font-weight: normal;
-}
-
-.markdown-body .highlight .mf,
-.markdown-body .highlight .mh,
-.markdown-body .highlight .mi,
-.markdown-body .highlight .mo,
-.markdown-body .highlight .il,
-.markdown-body .highlight .m {
-  color: #945277;
-}
-
-.markdown-body .highlight .s,
-.markdown-body .highlight .sb,
-.markdown-body .highlight .sc,
-.markdown-body .highlight .sd,
-.markdown-body .highlight .s2,
-.markdown-body .highlight .se,
-.markdown-body .highlight .sh,
-.markdown-body .highlight .si,
-.markdown-body .highlight .sx,
-.markdown-body .highlight .s1 {
-  color: #df5000;
-}
-
-.markdown-body .highlight .kc,
-.markdown-body .highlight .kd,
-.markdown-body .highlight .kn,
-.markdown-body .highlight .kp,
-.markdown-body .highlight .kr,
-.markdown-body .highlight .kt,
-.markdown-body .highlight .k,
-.markdown-body .highlight .o {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .kt {
-  color: #458;
-}
-
-.markdown-body .highlight .c,
-.markdown-body .highlight .cm,
-.markdown-body .highlight .c1 {
-  color: #998;
-  font-style: italic;
-}
-
-.markdown-body .highlight .cp,
-.markdown-body .highlight .cs,
-.markdown-body .highlight .cp .h {
-  color: #999;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .cs {
-  font-style: italic;
-}
-
-.markdown-body .highlight .n {
-  color: #333;
-}
-
-.markdown-body .highlight .na,
-.markdown-body .highlight .nv,
-.markdown-body .highlight .vc,
-.markdown-body .highlight .vg,
-.markdown-body .highlight .vi {
-  color: #008080;
-}
-
-.markdown-body .highlight .nb {
-  color: #0086B3;
-}
-
-.markdown-body .highlight .nc {
-  color: #458;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .no {
-  color: #094e99;
-}
-
-.markdown-body .highlight .ni {
-  color: #800080;
-}
-
-.markdown-body .highlight .ne {
-  color: #990000;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .nf {
-  color: #945277;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .nn {
-  color: #555;
-}
-
-.markdown-body .highlight .nt {
-  color: #000080;
-}
-
-.markdown-body .highlight .err {
-  color: #a61717;
-  background-color: #e3d2d2;
-}
-
-.markdown-body .highlight .gd {
-  color: #000;
-  background-color: #fdd;
-}
-
-.markdown-body .highlight .gd .x {
-  color: #000;
-  background-color: #faa;
-}
-
-.markdown-body .highlight .ge {
-  font-style: italic;
-}
-
-.markdown-body .highlight .gr {
-  color: #aa0000;
-}
-
-.markdown-body .highlight .gh {
-  color: #999;
-}
-
-.markdown-body .highlight .gi {
-  color: #000;
-  background-color: #dfd;
-}
-
-.markdown-body .highlight .gi .x {
-  color: #000;
-  background-color: #afa;
-}
-
-.markdown-body .highlight .go {
-  color: #888;
-}
-
-.markdown-body .highlight .gp {
-  color: #555;
-}
-
-.markdown-body .highlight .gs {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .gu {
-  color: #800080;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .gt {
-  color: #aa0000;
-}
-
-.markdown-body .highlight .ow {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .w {
-  color: #bbb;
-}
-
-.markdown-body .highlight .sr {
-  color: #017936;
-}
-
-.markdown-body .highlight .ss {
-  color: #8b467f;
-}
-
-.markdown-body .highlight .bp {
-  color: #999;
-}
-
-.markdown-body .highlight .gc {
-  color: #999;
-  background-color: #EAF2F5;
-}
-
-.markdown-body kbd {
-  background-color: #e7e7e7;
-  background-image: -webkit-linear-gradient(#fefefe, #e7e7e7);
-  background-image: linear-gradient(#fefefe, #e7e7e7);
-  background-repeat: repeat-x;
-  display: inline-block;
-  padding: 3px 5px;
-  font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace;
-  line-height: 10px;
-  color: #000;
-  border: 1px solid #cfcfcf;
-  border-radius: 2px;
-}
-
-.markdown-body .highlight .pl-coc,
-.markdown-body .highlight .pl-entm,
-.markdown-body .highlight .pl-eoa,
-.markdown-body .highlight .pl-mai .pl-sf,
-.markdown-body .highlight .pl-pdv,
-.markdown-body .highlight .pl-sc,
-.markdown-body .highlight .pl-sr,
-.markdown-body .highlight .pl-v,
-.markdown-body .highlight .pl-vpf {
-  color: #0086b3;
-}
-
-.markdown-body .highlight .pl-eoac,
-.markdown-body .highlight .pl-mdht,
-.markdown-body .highlight .pl-mi1,
-.markdown-body .highlight .pl-mri,
-.markdown-body .highlight .pl-va,
-.markdown-body .highlight .pl-vpu {
-  color: #008080;
-}
-
-.markdown-body .highlight .pl-c,
-.markdown-body .highlight .pl-pdc {
-  color: #b4b7b4;
-  font-style: italic;
-}
-
-.markdown-body .highlight .pl-k,
-.markdown-body .highlight .pl-ko,
-.markdown-body .highlight .pl-kolp,
-.markdown-body .highlight .pl-mc,
-.markdown-body .highlight .pl-mr,
-.markdown-body .highlight .pl-ms,
-.markdown-body .highlight .pl-s,
-.markdown-body .highlight .pl-sok,
-.markdown-body .highlight .pl-st {
-  color: #6e5494;
-}
-
-.markdown-body .highlight .pl-ef,
-.markdown-body .highlight .pl-enf,
-.markdown-body .highlight .pl-enm,
-.markdown-body .highlight .pl-entc,
-.markdown-body .highlight .pl-eoi,
-.markdown-body .highlight .pl-sf,
-.markdown-body .highlight .pl-smc {
-  color: #d12089;
-}
-
-.markdown-body .highlight .pl-ens,
-.markdown-body .highlight .pl-eoai,
-.markdown-body .highlight .pl-kos,
-.markdown-body .highlight .pl-mh .pl-pdh,
-.markdown-body .highlight .pl-mp,
-.markdown-body .highlight .pl-pde,
-.markdown-body .highlight .pl-stp {
-  color: #458;
-}
-
-.markdown-body .highlight .pl-enti {
-  color: #d12089;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-cce,
-.markdown-body .highlight .pl-enc,
-.markdown-body .highlight .pl-kou,
-.markdown-body .highlight .pl-mq {
-  color: #f93;
-}
-
-.markdown-body .highlight .pl-mp1 .pl-sf {
-  color: #458;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-cos,
-.markdown-body .highlight .pl-ent,
-.markdown-body .highlight .pl-md,
-.markdown-body .highlight .pl-mdhf,
-.markdown-body .highlight .pl-ml,
-.markdown-body .highlight .pl-pdc1,
-.markdown-body .highlight .pl-pds,
-.markdown-body .highlight .pl-s1,
-.markdown-body .highlight .pl-scp,
-.markdown-body .highlight .pl-sol {
-  color: #df5000;
-}
-
-.markdown-body .highlight .pl-c1,
-.markdown-body .highlight .pl-cn,
-.markdown-body .highlight .pl-pse,
-.markdown-body .highlight .pl-pse .pl-s2,
-.markdown-body .highlight .pl-vi {
-  color: #a31515;
-}
-
-.markdown-body .highlight .pl-mb,
-.markdown-body .highlight .pl-pdb {
-  color: #df5000;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-mi,
-.markdown-body .highlight .pl-pdi {
-  color: #6e5494;
-  font-style: italic;
-}
-
-.markdown-body .highlight .pl-ms1 {
-  background-color: #f5f5f5;
-}
-
-.markdown-body .highlight .pl-mdh,
-.markdown-body .highlight .pl-mdi {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-mdr {
-  color: #0086b3;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-s2 {
-  color: #333;
-}
-
-.markdown-body .highlight .pl-ii {
-  background-color: #df5000;
-  color: #fff;
-}
-
-.markdown-body .highlight .pl-ib {
-  background-color: #f93;
-}
-
-.markdown-body .highlight .pl-id {
-  background-color: #a31515;
-  color: #fff;
-}
-
-.markdown-body .highlight .pl-iu {
-  background-color: #b4b7b4;
-}
-
-.markdown-body .highlight .pl-mo {
-  color: #969896;
-}
-
-.markdown-body .task-list-item {
-  list-style-type: none;
-}
-
-.markdown-body .task-list-item+.task-list-item {
-  margin-top: 3px;
-}
-
-.markdown-body .task-list-item input {
-  float: left;
-  margin: 0.3em 0 0.25em -1.6em;
-  vertical-align: middle;
-}</style><title>usage</title></head><body><article class="markdown-body"><h1 id="usage">
-<a id="user-content-usage" class="anchor" href="#usage" aria-hidden="true"><span class="octicon octicon-link"></span></a>Usage</h1>
-
-<pre><code>$ phpunit --bootstrap=modules/unittest/bootstrap.php modules/unittest/tests.php
-</code></pre>
-
-<p>Alternatively you can use a phpunit.xml to have a more fine grained control over which tests are included and which files are whitelisted.</p>
-
-<p>Make sure you only whitelist the highest files in the cascading filesystem, else you could end up with a lot of "class cannot be redefined" errors.</p>
-
-<p>If you use the tests.php testsuite loader then it will only whitelist the highest files. see config/unittest.php for details on configuring the tests.php whitelist.</p>
-
-<h2 id="writing-tests">
-<a id="user-content-writing-tests" class="anchor" href="#writing-tests" aria-hidden="true"><span class="octicon octicon-link"></span></a>Writing tests</h2>
-
-<p>If you're writing a test for your application, place it in "application/tests".  Similarly, if you're writing a test for a module place it in modules/[modulefolder]/tests</p>
-
-<p>Rather than tell you how to write tests I'll point you in the direction of the <a href="http://www.phpunit.de/manual/3.4/en/index.html">PHPUnit Manual</a>.  One thing you should bear in mind when writing tests is that testcases should extend Unittest_Testcase rather than PHPUnit_Framework_TestCase, doing so gives you access to useful kohana specific helpers such as <code>setEnvironment()</code>.</p>
-
-<p>Here's a taster of some of the cool things you can do with phpunit:</p>
-
-<h3 id="data-providers">
-<a id="user-content-data-providers" class="anchor" href="#data-providers" aria-hidden="true"><span class="octicon octicon-link"></span></a>Data Providers</h3>
-
-<p>Sometimes you want to be able to run a specific test with different sets of data to try and test every eventuality</p>
-
-<p>Ordinarily you could use a foreach loop to iterate over an array of test data, however PHPUnit already can take care of this for us rather easily using "Data Providers".  A data provider is a function that returns an array of arguments that can be passed to a test.</p>
-
-<pre><code>&lt;?php
-
-Class ReallyCoolTest extends Unittest_TestCase
-{
-    function providerStrLen()
-    {
-        return array(
-            array('One set of testcase data', 24),
-            array('This is a different one', 23),
-        );
-    }
-
-    /**
-     * @dataProvider providerStrLen
-     */
-    function testStrLen($string, $length)
-    {
-        $this-&gt;assertSame(
-            $length,
-            strlen($string)
-        );
-    }
-}
-</code></pre>
-
-<p>The key thing to notice is the <code>@dataProvider</code> tag in the doccomment, this is what tells PHPUnit to use a data provider.  The provider prefix is totally optional but it's a nice standard to identify providers.</p>
-
-<p>For more info see:</p>
-
-<ul>
-<li><a href="http://sebastian-bergmann.de/archives/702-Data-Providers-in-PHPUnit-3.2.html">Data Providers in PHPUnit 3.2</a></li>
-<li><a href="http://www.phpunit.de/manual/3.4/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.data-providers">Data Providers</a></li>
-</ul>
-
-<h3 id="grouping-tests">
-<a id="user-content-grouping-tests" class="anchor" href="#grouping-tests" aria-hidden="true"><span class="octicon octicon-link"></span></a>Grouping tests</h3>
-
-<p>To allow users to selectively run tests you need to organise your tests into groups.  Here's an example test showing how to do this:</p>
-
-<pre><code>&lt;?php
-
-/**
- * This is a description for my testcase
- *
- * @group somegroup
- * @group somegroup.morespecific
- */
-Class AnotherReallyCoolTest extends Unittest_TestCase
-{
-    /**
-     * Tests can also be grouped too!
-     *
-     * @group somegroup.morespecific.annoyingstuff
-     */
-    function testSomeAnnoyingCase()
-    {
-        // CODE!!
-    }
-}
-</code></pre>
-
-<p>Our convention is to use lowercase group names, with more specific levels in a group seperated by periods. i.e. The Validate helper tests are part of the following groups:</p>
-
-<pre><code>kohana
-kohana.validation
-kohana.validation.helpers
-</code></pre>
-
-<p>To actually limit your testing to the "somegroup" group, use:</p>
-
-<pre><code>$ phpunit --boostrap=index.php --group=somegroup modules/unittest/tests.php
-</code></pre>
-
-<p>This functionality can be used to record which bug reports a test is for:</p>
-
-<pre><code>/**
- *
- * @group bugs.1477
- */
-function testAccountCannotGoBelowZero()
-{
-    // Some arbitary code
-}
-</code></pre>
-
-<p>To see all groups that are available in your code run:</p>
-
-<pre><code>$ phpunit --boostrap=modules/unittest/bootstrap.php --list-groups modules/unittest/tests.php
-</code></pre>
-
-<p><em>Note:</em> the <code>--list-groups</code> switch should appear before the path to the test suite loader</p>
-
-<p>You can also exclude groups while testing using the <code>--exclude-group</code> switch.  This can be useful if you want to ignore all kohana tests:</p>
-
-<pre><code>$ phpunit --bootstrap=modules/unittest/bootstrap.php --exclude-group=kohana modules/unittest/tests.php
-</code></pre>
-
-<p>For more info see:</p>
-
-<ul>
-<li><a href="http://mikenaberezny.com/2007/09/04/better-phpunit-group-annotations/">Better PHPUnit Group Annotations</a></li>
-<li><a href="http://sebastian-bergmann.de/archives/697-TestNG-style-Grouping-of-Tests.html">TestNG style Grouping of Tests in PHPUnit 3.2</a></li>
-</ul>
-</article></body></html>
\ No newline at end of file
diff --git a/doc/dev/testing/kohana/usage.md b/doc/dev/testing/kohana/usage.md
deleted file mode 100644
index 41682f8310244a4f66486dff07af62e80b61d20f..0000000000000000000000000000000000000000
--- a/doc/dev/testing/kohana/usage.md
+++ /dev/null
@@ -1,117 +0,0 @@
-# Usage
-
-	$ phpunit --bootstrap=modules/unittest/bootstrap.php modules/unittest/tests.php
-
-Alternatively you can use a phpunit.xml to have a more fine grained control over which tests are included and which files are whitelisted.
-
-Make sure you only whitelist the highest files in the cascading filesystem, else you could end up with a lot of "class cannot be redefined" errors.
-
-If you use the tests.php testsuite loader then it will only whitelist the highest files. see config/unittest.php for details on configuring the tests.php whitelist.
-
-## Writing tests
-
-If you're writing a test for your application, place it in "application/tests".  Similarly, if you're writing a test for a module place it in modules/[modulefolder]/tests
-
-Rather than tell you how to write tests I'll point you in the direction of the [PHPUnit Manual](http://www.phpunit.de/manual/3.4/en/index.html).  One thing you should bear in mind when writing tests is that testcases should extend Unittest_Testcase rather than PHPUnit_Framework_TestCase, doing so gives you access to useful kohana specific helpers such as `setEnvironment()`.
-
-Here's a taster of some of the cool things you can do with phpunit:
-
-### Data Providers
-
-Sometimes you want to be able to run a specific test with different sets of data to try and test every eventuality
-
-Ordinarily you could use a foreach loop to iterate over an array of test data, however PHPUnit already can take care of this for us rather easily using "Data Providers".  A data provider is a function that returns an array of arguments that can be passed to a test.
-
-	<?php
-
-	Class ReallyCoolTest extends Unittest_TestCase
-	{
-		function providerStrLen()
-		{
-			return array(
-				array('One set of testcase data', 24),
-				array('This is a different one', 23),
-			);
-		}
-
-		/**
-		 * @dataProvider providerStrLen
-		 */
-		function testStrLen($string, $length)
-		{
-			$this->assertSame(
-				$length,
-				strlen($string)
-			);
-		}
-	}
-
-The key thing to notice is the `@dataProvider` tag in the doccomment, this is what tells PHPUnit to use a data provider.  The provider prefix is totally optional but it's a nice standard to identify providers.
-
-For more info see:
-
-* [Data Providers in PHPUnit 3.2](http://sebastian-bergmann.de/archives/702-Data-Providers-in-PHPUnit-3.2.html)
-* [Data Providers](http://www.phpunit.de/manual/3.4/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.data-providers)
-
-
-### Grouping tests
-
-To allow users to selectively run tests you need to organise your tests into groups.  Here's an example test showing how to do this:
-
-
-	<?php
-
-	/**
-	 * This is a description for my testcase
-	 *
-	 * @group somegroup
-	 * @group somegroup.morespecific
-	 */
-	Class AnotherReallyCoolTest extends Unittest_TestCase
-	{
-		/**
-		 * Tests can also be grouped too!
-		 *
-		 * @group somegroup.morespecific.annoyingstuff
-		 */
-		function testSomeAnnoyingCase()
-		{
-			// CODE!!
-		}
-	}
-
-Our convention is to use lowercase group names, with more specific levels in a group seperated by periods. i.e. The Validate helper tests are part of the following groups:
-
-	kohana
-	kohana.validation
-	kohana.validation.helpers
-
-To actually limit your testing to the "somegroup" group, use:
-
-	$ phpunit --boostrap=index.php --group=somegroup modules/unittest/tests.php
-
-This functionality can be used to record which bug reports a test is for:
-
-	/**
-	 *
-	 * @group bugs.1477
-	 */
-	function testAccountCannotGoBelowZero()
-	{
-		// Some arbitary code
-	}
-
-To see all groups that are available in your code run:
-
-	$ phpunit --boostrap=modules/unittest/bootstrap.php --list-groups modules/unittest/tests.php
-
-*Note:* the `--list-groups` switch should appear before the path to the test suite loader
-
-You can also exclude groups while testing using the `--exclude-group` switch.  This can be useful if you want to ignore all kohana tests:
-
-	$ phpunit --bootstrap=modules/unittest/bootstrap.php --exclude-group=kohana modules/unittest/tests.php
-
-For more info see:
-
-* [Better PHPUnit Group Annotations](http://mikenaberezny.com/2007/09/04/better-phpunit-group-annotations/)
-* [TestNG style Grouping of Tests in PHPUnit 3.2](http://sebastian-bergmann.de/archives/697-TestNG-style-Grouping-of-Tests.html)
diff --git a/doc/dev/testing/phpunit.html b/doc/dev/testing/phpunit.html
deleted file mode 100644
index 598f1ba9f0dc8842f6ad409046a392afdbf65a9d..0000000000000000000000000000000000000000
--- a/doc/dev/testing/phpunit.html
+++ /dev/null
@@ -1,930 +0,0 @@
-<!DOCTYPE html><html><head><meta charset="utf-8"><style>body {
-  width: 45em;
-  border: 1px solid #ddd;
-  outline: 1300px solid #fff;
-  margin: 16px auto;
-}
-
-body .markdown-body
-{
-  padding: 30px;
-}
-
-@font-face {
-  font-family: octicons-anchor;
-  src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAYcAA0AAAAACjQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABMAAAABwAAAAca8vGTk9TLzIAAAFMAAAARAAAAFZG1VHVY21hcAAAAZAAAAA+AAABQgAP9AdjdnQgAAAB0AAAAAQAAAAEACICiGdhc3AAAAHUAAAACAAAAAj//wADZ2x5ZgAAAdwAAADRAAABEKyikaNoZWFkAAACsAAAAC0AAAA2AtXoA2hoZWEAAALgAAAAHAAAACQHngNFaG10eAAAAvwAAAAQAAAAEAwAACJsb2NhAAADDAAAAAoAAAAKALIAVG1heHAAAAMYAAAAHwAAACABEAB2bmFtZQAAAzgAAALBAAAFu3I9x/Nwb3N0AAAF/AAAAB0AAAAvaoFvbwAAAAEAAAAAzBdyYwAAAADP2IQvAAAAAM/bz7t4nGNgZGFgnMDAysDB1Ml0hoGBoR9CM75mMGLkYGBgYmBlZsAKAtJcUxgcPsR8iGF2+O/AEMPsznAYKMwIkgMA5REMOXicY2BgYGaAYBkGRgYQsAHyGMF8FgYFIM0ChED+h5j//yEk/3KoSgZGNgYYk4GRCUgwMaACRoZhDwCs7QgGAAAAIgKIAAAAAf//AAJ4nHWMMQrCQBBF/0zWrCCIKUQsTDCL2EXMohYGSSmorScInsRGL2DOYJe0Ntp7BK+gJ1BxF1stZvjz/v8DRghQzEc4kIgKwiAppcA9LtzKLSkdNhKFY3HF4lK69ExKslx7Xa+vPRVS43G98vG1DnkDMIBUgFN0MDXflU8tbaZOUkXUH0+U27RoRpOIyCKjbMCVejwypzJJG4jIwb43rfl6wbwanocrJm9XFYfskuVC5K/TPyczNU7b84CXcbxks1Un6H6tLH9vf2LRnn8Ax7A5WQAAAHicY2BkYGAA4teL1+yI57f5ysDNwgAC529f0kOmWRiYVgEpDgYmEA8AUzEKsQAAAHicY2BkYGB2+O/AEMPCAAJAkpEBFbAAADgKAe0EAAAiAAAAAAQAAAAEAAAAAAAAKgAqACoAiAAAeJxjYGRgYGBhsGFgYgABEMkFhAwM/xn0QAIAD6YBhwB4nI1Ty07cMBS9QwKlQapQW3VXySvEqDCZGbGaHULiIQ1FKgjWMxknMfLEke2A+IJu+wntrt/QbVf9gG75jK577Lg8K1qQPCfnnnt8fX1NRC/pmjrk/zprC+8D7tBy9DHgBXoWfQ44Av8t4Bj4Z8CLtBL9CniJluPXASf0Lm4CXqFX8Q84dOLnMB17N4c7tBo1AS/Qi+hTwBH4rwHHwN8DXqQ30XXAS7QaLwSc0Gn8NuAVWou/gFmnjLrEaEh9GmDdDGgL3B4JsrRPDU2hTOiMSuJUIdKQQayiAth69r6akSSFqIJuA19TrzCIaY8sIoxyrNIrL//pw7A2iMygkX5vDj+G+kuoLdX4GlGK/8Lnlz6/h9MpmoO9rafrz7ILXEHHaAx95s9lsI7AHNMBWEZHULnfAXwG9/ZqdzLI08iuwRloXE8kfhXYAvE23+23DU3t626rbs8/8adv+9DWknsHp3E17oCf+Z48rvEQNZ78paYM38qfk3v/u3l3u3GXN2Dmvmvpf1Srwk3pB/VSsp512bA/GG5i2WJ7wu430yQ5K3nFGiOqgtmSB5pJVSizwaacmUZzZhXLlZTq8qGGFY2YcSkqbth6aW1tRmlaCFs2016m5qn36SbJrqosG4uMV4aP2PHBmB3tjtmgN2izkGQyLWprekbIntJFing32a5rKWCN/SdSoga45EJykyQ7asZvHQ8PTm6cslIpwyeyjbVltNikc2HTR7YKh9LBl9DADC0U/jLcBZDKrMhUBfQBvXRzLtFtjU9eNHKin0x5InTqb8lNpfKv1s1xHzTXRqgKzek/mb7nB8RZTCDhGEX3kK/8Q75AmUM/eLkfA+0Hi908Kx4eNsMgudg5GLdRD7a84npi+YxNr5i5KIbW5izXas7cHXIMAau1OueZhfj+cOcP3P8MNIWLyYOBuxL6DRylJ4cAAAB4nGNgYoAALjDJyIAOWMCiTIxMLDmZedkABtIBygAAAA==) format('woff');
-}
-
-.markdown-body {
-  -ms-text-size-adjust: 100%;
-  -webkit-text-size-adjust: 100%;
-  color: #333;
-  overflow: hidden;
-  font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif;
-  font-size: 16px;
-  line-height: 1.6;
-  word-wrap: break-word;
-}
-
-.markdown-body a {
-  background: transparent;
-}
-
-.markdown-body a:active,
-.markdown-body a:hover {
-  outline: 0;
-}
-
-.markdown-body strong {
-  font-weight: bold;
-}
-
-.markdown-body h1 {
-  font-size: 2em;
-  margin: 0.67em 0;
-}
-
-.markdown-body img {
-  border: 0;
-}
-
-.markdown-body hr {
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-  height: 0;
-}
-
-.markdown-body pre {
-  overflow: auto;
-}
-
-.markdown-body code,
-.markdown-body kbd,
-.markdown-body pre {
-  font-family: monospace, monospace;
-  font-size: 1em;
-}
-
-.markdown-body input {
-  color: inherit;
-  font: inherit;
-  margin: 0;
-}
-
-.markdown-body html input[disabled] {
-  cursor: default;
-}
-
-.markdown-body input {
-  line-height: normal;
-}
-
-.markdown-body input[type="checkbox"] {
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  padding: 0;
-}
-
-.markdown-body table {
-  border-collapse: collapse;
-  border-spacing: 0;
-}
-
-.markdown-body td,
-.markdown-body th {
-  padding: 0;
-}
-
-.markdown-body * {
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-
-.markdown-body input {
-  font: 13px/1.4 Helvetica, arial, freesans, clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol";
-}
-
-.markdown-body a {
-  color: #4183c4;
-  text-decoration: none;
-}
-
-.markdown-body a:hover,
-.markdown-body a:focus,
-.markdown-body a:active {
-  text-decoration: underline;
-}
-
-.markdown-body hr {
-  height: 0;
-  margin: 15px 0;
-  overflow: hidden;
-  background: transparent;
-  border: 0;
-  border-bottom: 1px solid #ddd;
-}
-
-.markdown-body hr:before {
-  display: table;
-  content: "";
-}
-
-.markdown-body hr:after {
-  display: table;
-  clear: both;
-  content: "";
-}
-
-.markdown-body h1,
-.markdown-body h2,
-.markdown-body h3,
-.markdown-body h4,
-.markdown-body h5,
-.markdown-body h6 {
-  margin-top: 15px;
-  margin-bottom: 15px;
-  line-height: 1.1;
-}
-
-.markdown-body h1 {
-  font-size: 30px;
-}
-
-.markdown-body h2 {
-  font-size: 21px;
-}
-
-.markdown-body h3 {
-  font-size: 16px;
-}
-
-.markdown-body h4 {
-  font-size: 14px;
-}
-
-.markdown-body h5 {
-  font-size: 12px;
-}
-
-.markdown-body h6 {
-  font-size: 11px;
-}
-
-.markdown-body blockquote {
-  margin: 0;
-}
-
-.markdown-body ul,
-.markdown-body ol {
-  padding: 0;
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-.markdown-body ol ol,
-.markdown-body ul ol {
-  list-style-type: lower-roman;
-}
-
-.markdown-body ul ul ol,
-.markdown-body ul ol ol,
-.markdown-body ol ul ol,
-.markdown-body ol ol ol {
-  list-style-type: lower-alpha;
-}
-
-.markdown-body dd {
-  margin-left: 0;
-}
-
-.markdown-body code {
-  font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace;
-}
-
-.markdown-body pre {
-  margin-top: 0;
-  margin-bottom: 0;
-  font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace;
-}
-
-.markdown-body .octicon {
-  font: normal normal 16px octicons-anchor;
-  line-height: 1;
-  display: inline-block;
-  text-decoration: none;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-
-.markdown-body .octicon-link:before {
-  content: '\f05c';
-}
-
-.markdown-body>*:first-child {
-  margin-top: 0 !important;
-}
-
-.markdown-body>*:last-child {
-  margin-bottom: 0 !important;
-}
-
-.markdown-body .anchor {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  display: block;
-  padding-right: 6px;
-  padding-left: 30px;
-  margin-left: -30px;
-}
-
-.markdown-body .anchor:focus {
-  outline: none;
-}
-
-.markdown-body h1,
-.markdown-body h2,
-.markdown-body h3,
-.markdown-body h4,
-.markdown-body h5,
-.markdown-body h6 {
-  position: relative;
-  margin-top: 1em;
-  margin-bottom: 16px;
-  font-weight: bold;
-  line-height: 1.4;
-}
-
-.markdown-body h1 .octicon-link,
-.markdown-body h2 .octicon-link,
-.markdown-body h3 .octicon-link,
-.markdown-body h4 .octicon-link,
-.markdown-body h5 .octicon-link,
-.markdown-body h6 .octicon-link {
-  display: none;
-  color: #000;
-  vertical-align: middle;
-}
-
-.markdown-body h1:hover .anchor,
-.markdown-body h2:hover .anchor,
-.markdown-body h3:hover .anchor,
-.markdown-body h4:hover .anchor,
-.markdown-body h5:hover .anchor,
-.markdown-body h6:hover .anchor {
-  padding-left: 8px;
-  margin-left: -30px;
-  line-height: 1;
-  text-decoration: none;
-}
-
-.markdown-body h1:hover .anchor .octicon-link,
-.markdown-body h2:hover .anchor .octicon-link,
-.markdown-body h3:hover .anchor .octicon-link,
-.markdown-body h4:hover .anchor .octicon-link,
-.markdown-body h5:hover .anchor .octicon-link,
-.markdown-body h6:hover .anchor .octicon-link {
-  display: inline-block;
-}
-
-.markdown-body h1 {
-  padding-bottom: 0.3em;
-  font-size: 2.25em;
-  line-height: 1.2;
-  border-bottom: 1px solid #eee;
-}
-
-.markdown-body h2 {
-  padding-bottom: 0.3em;
-  font-size: 1.75em;
-  line-height: 1.225;
-  border-bottom: 1px solid #eee;
-}
-
-.markdown-body h3 {
-  font-size: 1.5em;
-  line-height: 1.43;
-}
-
-.markdown-body h4 {
-  font-size: 1.25em;
-}
-
-.markdown-body h5 {
-  font-size: 1em;
-}
-
-.markdown-body h6 {
-  font-size: 1em;
-  color: #777;
-}
-
-.markdown-body p,
-.markdown-body blockquote,
-.markdown-body ul,
-.markdown-body ol,
-.markdown-body dl,
-.markdown-body table,
-.markdown-body pre {
-  margin-top: 0;
-  margin-bottom: 16px;
-}
-
-.markdown-body hr {
-  height: 4px;
-  padding: 0;
-  margin: 16px 0;
-  background-color: #e7e7e7;
-  border: 0 none;
-}
-
-.markdown-body ul,
-.markdown-body ol {
-  padding-left: 2em;
-}
-
-.markdown-body ul ul,
-.markdown-body ul ol,
-.markdown-body ol ol,
-.markdown-body ol ul {
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-.markdown-body li>p {
-  margin-top: 16px;
-}
-
-.markdown-body dl {
-  padding: 0;
-}
-
-.markdown-body dl dt {
-  padding: 0;
-  margin-top: 16px;
-  font-size: 1em;
-  font-style: italic;
-  font-weight: bold;
-}
-
-.markdown-body dl dd {
-  padding: 0 16px;
-  margin-bottom: 16px;
-}
-
-.markdown-body blockquote {
-  padding: 0 15px;
-  color: #777;
-  border-left: 4px solid #ddd;
-}
-
-.markdown-body blockquote>:first-child {
-  margin-top: 0;
-}
-
-.markdown-body blockquote>:last-child {
-  margin-bottom: 0;
-}
-
-.markdown-body table {
-  display: block;
-  width: 100%;
-  overflow: auto;
-  word-break: normal;
-  word-break: keep-all;
-}
-
-.markdown-body table th {
-  font-weight: bold;
-}
-
-.markdown-body table th,
-.markdown-body table td {
-  padding: 6px 13px;
-  border: 1px solid #ddd;
-}
-
-.markdown-body table tr {
-  background-color: #fff;
-  border-top: 1px solid #ccc;
-}
-
-.markdown-body table tr:nth-child(2n) {
-  background-color: #f8f8f8;
-}
-
-.markdown-body img {
-  max-width: 100%;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-
-.markdown-body code {
-  padding: 0;
-  padding-top: 0.2em;
-  padding-bottom: 0.2em;
-  margin: 0;
-  font-size: 85%;
-  background-color: rgba(0,0,0,0.04);
-  border-radius: 3px;
-}
-
-.markdown-body code:before,
-.markdown-body code:after {
-  letter-spacing: -0.2em;
-  content: "\00a0";
-}
-
-.markdown-body pre>code {
-  padding: 0;
-  margin: 0;
-  font-size: 100%;
-  word-break: normal;
-  white-space: pre;
-  background: transparent;
-  border: 0;
-}
-
-.markdown-body .highlight {
-  margin-bottom: 16px;
-}
-
-.markdown-body .highlight pre,
-.markdown-body pre {
-  padding: 16px;
-  overflow: auto;
-  font-size: 85%;
-  line-height: 1.45;
-  background-color: #f7f7f7;
-  border-radius: 3px;
-}
-
-.markdown-body .highlight pre {
-  margin-bottom: 0;
-  word-break: normal;
-}
-
-.markdown-body pre {
-  word-wrap: normal;
-}
-
-.markdown-body pre code {
-  display: inline;
-  max-width: initial;
-  padding: 0;
-  margin: 0;
-  overflow: initial;
-  line-height: inherit;
-  word-wrap: normal;
-  background-color: transparent;
-  border: 0;
-}
-
-.markdown-body pre code:before,
-.markdown-body pre code:after {
-  content: normal;
-}
-
-.markdown-body .highlight {
-  background: #fff;
-}
-
-.markdown-body .highlight .h {
-  color: #333;
-  font-style: normal;
-  font-weight: normal;
-}
-
-.markdown-body .highlight .mf,
-.markdown-body .highlight .mh,
-.markdown-body .highlight .mi,
-.markdown-body .highlight .mo,
-.markdown-body .highlight .il,
-.markdown-body .highlight .m {
-  color: #945277;
-}
-
-.markdown-body .highlight .s,
-.markdown-body .highlight .sb,
-.markdown-body .highlight .sc,
-.markdown-body .highlight .sd,
-.markdown-body .highlight .s2,
-.markdown-body .highlight .se,
-.markdown-body .highlight .sh,
-.markdown-body .highlight .si,
-.markdown-body .highlight .sx,
-.markdown-body .highlight .s1 {
-  color: #df5000;
-}
-
-.markdown-body .highlight .kc,
-.markdown-body .highlight .kd,
-.markdown-body .highlight .kn,
-.markdown-body .highlight .kp,
-.markdown-body .highlight .kr,
-.markdown-body .highlight .kt,
-.markdown-body .highlight .k,
-.markdown-body .highlight .o {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .kt {
-  color: #458;
-}
-
-.markdown-body .highlight .c,
-.markdown-body .highlight .cm,
-.markdown-body .highlight .c1 {
-  color: #998;
-  font-style: italic;
-}
-
-.markdown-body .highlight .cp,
-.markdown-body .highlight .cs,
-.markdown-body .highlight .cp .h {
-  color: #999;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .cs {
-  font-style: italic;
-}
-
-.markdown-body .highlight .n {
-  color: #333;
-}
-
-.markdown-body .highlight .na,
-.markdown-body .highlight .nv,
-.markdown-body .highlight .vc,
-.markdown-body .highlight .vg,
-.markdown-body .highlight .vi {
-  color: #008080;
-}
-
-.markdown-body .highlight .nb {
-  color: #0086B3;
-}
-
-.markdown-body .highlight .nc {
-  color: #458;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .no {
-  color: #094e99;
-}
-
-.markdown-body .highlight .ni {
-  color: #800080;
-}
-
-.markdown-body .highlight .ne {
-  color: #990000;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .nf {
-  color: #945277;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .nn {
-  color: #555;
-}
-
-.markdown-body .highlight .nt {
-  color: #000080;
-}
-
-.markdown-body .highlight .err {
-  color: #a61717;
-  background-color: #e3d2d2;
-}
-
-.markdown-body .highlight .gd {
-  color: #000;
-  background-color: #fdd;
-}
-
-.markdown-body .highlight .gd .x {
-  color: #000;
-  background-color: #faa;
-}
-
-.markdown-body .highlight .ge {
-  font-style: italic;
-}
-
-.markdown-body .highlight .gr {
-  color: #aa0000;
-}
-
-.markdown-body .highlight .gh {
-  color: #999;
-}
-
-.markdown-body .highlight .gi {
-  color: #000;
-  background-color: #dfd;
-}
-
-.markdown-body .highlight .gi .x {
-  color: #000;
-  background-color: #afa;
-}
-
-.markdown-body .highlight .go {
-  color: #888;
-}
-
-.markdown-body .highlight .gp {
-  color: #555;
-}
-
-.markdown-body .highlight .gs {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .gu {
-  color: #800080;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .gt {
-  color: #aa0000;
-}
-
-.markdown-body .highlight .ow {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .w {
-  color: #bbb;
-}
-
-.markdown-body .highlight .sr {
-  color: #017936;
-}
-
-.markdown-body .highlight .ss {
-  color: #8b467f;
-}
-
-.markdown-body .highlight .bp {
-  color: #999;
-}
-
-.markdown-body .highlight .gc {
-  color: #999;
-  background-color: #EAF2F5;
-}
-
-.markdown-body kbd {
-  background-color: #e7e7e7;
-  background-image: -webkit-linear-gradient(#fefefe, #e7e7e7);
-  background-image: linear-gradient(#fefefe, #e7e7e7);
-  background-repeat: repeat-x;
-  display: inline-block;
-  padding: 3px 5px;
-  font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace;
-  line-height: 10px;
-  color: #000;
-  border: 1px solid #cfcfcf;
-  border-radius: 2px;
-}
-
-.markdown-body .highlight .pl-coc,
-.markdown-body .highlight .pl-entm,
-.markdown-body .highlight .pl-eoa,
-.markdown-body .highlight .pl-mai .pl-sf,
-.markdown-body .highlight .pl-pdv,
-.markdown-body .highlight .pl-sc,
-.markdown-body .highlight .pl-sr,
-.markdown-body .highlight .pl-v,
-.markdown-body .highlight .pl-vpf {
-  color: #0086b3;
-}
-
-.markdown-body .highlight .pl-eoac,
-.markdown-body .highlight .pl-mdht,
-.markdown-body .highlight .pl-mi1,
-.markdown-body .highlight .pl-mri,
-.markdown-body .highlight .pl-va,
-.markdown-body .highlight .pl-vpu {
-  color: #008080;
-}
-
-.markdown-body .highlight .pl-c,
-.markdown-body .highlight .pl-pdc {
-  color: #b4b7b4;
-  font-style: italic;
-}
-
-.markdown-body .highlight .pl-k,
-.markdown-body .highlight .pl-ko,
-.markdown-body .highlight .pl-kolp,
-.markdown-body .highlight .pl-mc,
-.markdown-body .highlight .pl-mr,
-.markdown-body .highlight .pl-ms,
-.markdown-body .highlight .pl-s,
-.markdown-body .highlight .pl-sok,
-.markdown-body .highlight .pl-st {
-  color: #6e5494;
-}
-
-.markdown-body .highlight .pl-ef,
-.markdown-body .highlight .pl-enf,
-.markdown-body .highlight .pl-enm,
-.markdown-body .highlight .pl-entc,
-.markdown-body .highlight .pl-eoi,
-.markdown-body .highlight .pl-sf,
-.markdown-body .highlight .pl-smc {
-  color: #d12089;
-}
-
-.markdown-body .highlight .pl-ens,
-.markdown-body .highlight .pl-eoai,
-.markdown-body .highlight .pl-kos,
-.markdown-body .highlight .pl-mh .pl-pdh,
-.markdown-body .highlight .pl-mp,
-.markdown-body .highlight .pl-pde,
-.markdown-body .highlight .pl-stp {
-  color: #458;
-}
-
-.markdown-body .highlight .pl-enti {
-  color: #d12089;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-cce,
-.markdown-body .highlight .pl-enc,
-.markdown-body .highlight .pl-kou,
-.markdown-body .highlight .pl-mq {
-  color: #f93;
-}
-
-.markdown-body .highlight .pl-mp1 .pl-sf {
-  color: #458;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-cos,
-.markdown-body .highlight .pl-ent,
-.markdown-body .highlight .pl-md,
-.markdown-body .highlight .pl-mdhf,
-.markdown-body .highlight .pl-ml,
-.markdown-body .highlight .pl-pdc1,
-.markdown-body .highlight .pl-pds,
-.markdown-body .highlight .pl-s1,
-.markdown-body .highlight .pl-scp,
-.markdown-body .highlight .pl-sol {
-  color: #df5000;
-}
-
-.markdown-body .highlight .pl-c1,
-.markdown-body .highlight .pl-cn,
-.markdown-body .highlight .pl-pse,
-.markdown-body .highlight .pl-pse .pl-s2,
-.markdown-body .highlight .pl-vi {
-  color: #a31515;
-}
-
-.markdown-body .highlight .pl-mb,
-.markdown-body .highlight .pl-pdb {
-  color: #df5000;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-mi,
-.markdown-body .highlight .pl-pdi {
-  color: #6e5494;
-  font-style: italic;
-}
-
-.markdown-body .highlight .pl-ms1 {
-  background-color: #f5f5f5;
-}
-
-.markdown-body .highlight .pl-mdh,
-.markdown-body .highlight .pl-mdi {
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-mdr {
-  color: #0086b3;
-  font-weight: bold;
-}
-
-.markdown-body .highlight .pl-s2 {
-  color: #333;
-}
-
-.markdown-body .highlight .pl-ii {
-  background-color: #df5000;
-  color: #fff;
-}
-
-.markdown-body .highlight .pl-ib {
-  background-color: #f93;
-}
-
-.markdown-body .highlight .pl-id {
-  background-color: #a31515;
-  color: #fff;
-}
-
-.markdown-body .highlight .pl-iu {
-  background-color: #b4b7b4;
-}
-
-.markdown-body .highlight .pl-mo {
-  color: #969896;
-}
-
-.markdown-body .task-list-item {
-  list-style-type: none;
-}
-
-.markdown-body .task-list-item+.task-list-item {
-  margin-top: 3px;
-}
-
-.markdown-body .task-list-item input {
-  float: left;
-  margin: 0.3em 0 0.25em -1.6em;
-  vertical-align: middle;
-}</style><title>phpunit</title></head><body><article class="markdown-body"><h1 id="phpunit">
-<a id="user-content-phpunit" class="anchor" href="#phpunit" aria-hidden="true"><span class="octicon octicon-link"></span></a>PHPUnit</h1>
-
-<p><a href="https://phpunit.de/">PHPUnit</a> — фреймворк для юнит-тестирования приложений. С некоторого времени стал поддерживать и поведенческие тесты (BDD подход). Нужно учитывать, что из-за MVC модели Kohana, нужно использовать <em>непрямой</em> доступ к классам. Почитать об этом можно в разделе <a href="../index.html#kohana-integration">Kohana integration</a>.</p>
-
-<blockquote>
-<p>Возможно здесь появится иформация о TDD/BDD и прочих штуках</p>
-</blockquote>
-
-<h2 id="composer">
-<a id="user-content-composer" class="anchor" href="#composer" aria-hidden="true"><span class="octicon octicon-link"></span></a>Composer</h2>
-
-<p><a href="https://getcomposer.org/">Composer</a> — менеджер зависимостей для приложений, написанных на PHP. Сильно облегчает задачу обновления всех подключенных к проекту библиотек и фрейморков.</p>
-
-<p><a href="https://getcomposer.org/Composer-Setup.exe">Скачиваем</a> себе на машину, при установке указываем путь <code>OpenServer/modules/php/PHP-5.5/php.exe</code> — далее он самостоятельно добавится в PATH так, что вы сможете вызвать его из любой директории.</p>
-
-<p>Запускаем OpenServer, в меню выбираем: <em>Дополнительно</em> | <em>Консоль</em>. Команда <a href="https://getcomposer.org/doc/03-cli.md#self-update"><code>self-update</code></a> обновит Composer до последней версии.</p>
-
-<pre><code>$ php w:\modules\php\PHP-5.5\composer.phar self-update
-</code></pre>
-
-<h2 id="%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B2%D0%BD%D0%B5-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0">
-<a id="user-content-Установка-вне-проекта" class="anchor" href="#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B2%D0%BD%D0%B5-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0" aria-hidden="true"><span class="octicon octicon-link"></span></a>Установка вне проекта</h2>
-
-<div class="highlight highlight-bash"><pre>$ composer global require <span class="pl-s"><span class="pl-pds">"</span>phpunit/phpunit=4.5.*<span class="pl-pds">"</span></span></pre></div>
-
-<p>Composer подключится к репозиторию, скачает и установит пакеты.</p>
-
-<p>Открываем <code>OpenServer/modules/php/PHP-5.5/</code>, создаём файл <code>phpunit.bat</code> в кодировке CP886 (Cyrillic Windows), со следующим содержимым (<code>%username%</code> — имя пользователя):</p>
-
-<div class="highlight highlight-bash"><pre>@ECHO OFF
-php <span class="pl-s"><span class="pl-pds">"</span>C:/Users/%username%/AppData/Roaming/Composer/vendor/phpunit/phpunit/phpunit<span class="pl-pds">"</span></span> %<span class="pl-k">*</span></pre></div>
-
-<p>Пробуем работоспособность в консоли: <code>$ phpunit</code>. В ответ выпадет список параметров и строка:</p>
-
-<pre><code>PHPUnit 4.5.0 by Sebastian Bergmann and contributors.
-</code></pre>
-
-<h4 id="%D0%BA%D0%B0%D0%BA-%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D1%82%D0%B8%D1%82%D1%8C-%D1%82%D0%B5%D1%81%D1%82%D1%8B">
-<a id="user-content-Как-запустить-тесты" class="anchor" href="#%D0%9A%D0%B0%D0%BA-%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D1%82%D0%B8%D1%82%D1%8C-%D1%82%D0%B5%D1%81%D1%82%D1%8B" aria-hidden="true"><span class="octicon octicon-link"></span></a>Как запустить тесты</h4>
-
-<p>Согласно <a href="https://phpunit.de/manual/current/en/writing-tests-for-phpunit.html">туториалу</a> пишем тест:</p>
-
-<div class="highlight highlight-php"><pre><span class="pl-pse">&lt;?php</span><span class="pl-s1"></span>
-<span class="pl-s1"><span class="pl-k">class</span> <span class="pl-en">FailureTest</span> <span class="pl-k">extends</span> <span class="pl-e">PHPUnit_Framework_TestCase</span></span>
-<span class="pl-s1">{</span>
-<span class="pl-s1">    <span class="pl-k">public</span> <span class="pl-k">function</span> <span class="pl-en">testOne</span>() {</span>
-<span class="pl-s1">        <span class="pl-smi">$this</span><span class="pl-k">-&gt;</span>assertTrue(<span class="pl-c1">FALSE</span>);  <span class="pl-c">// Здесь будет ошибка</span></span>
-<span class="pl-s1">    }</span>
-<span class="pl-s1">}</span>
-<span class="pl-s1"></span><span class="pl-pse"><span class="pl-s1">?</span>&gt;</span></pre></div>
-
-<p>Я положил его в файл <code>OpenServer/domains/tests.com/test.php</code>, соответственно открываем консоль, переходим в директорию с помощью команды <code>cd domains/tests.com</code> и запускаем тест: <code>$ phpunit test.php</code>.</p>
-
-<h2 id="%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D1%81-phpstorm">
-<a id="user-content-Интеграция-с-phpstorm" class="anchor" href="#%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D1%81-phpstorm" aria-hidden="true"><span class="octicon octicon-link"></span></a>Интеграция с PHPStorm</h2>
-
-<p>Гайд установки от JetBrains можно почитать <a href="https://www.jetbrains.com/phpstorm/help/enabling-phpunit-support.html">здесь</a>. Краткое содержание:</p>
-
-<ul>
-<li><p>Открываем проект, <em>Tools</em> | <em>Composer</em> | <em>Init Composer</em>, указываем путь <code>./modules/php/PHP-5.5/</code>, во второй строке <code>./modules/php/PHP-5.5/composer.pchar</code>.</p></li>
-<li><p>PHPUnit <strong>не должен</strong> быть под системой контроля версий. Проверьте наличие папки <code>~dev_rating/modules/unittest/vendor</code>, и если её нет, то переходим в <em>Tools</em> | <em>Composer</em> | <em>Add dependency</em>. Указываем <code>phpunit/phpunit</code> &gt; <em>Install</em>.</p></li>
-<li><p>Далее <em>Settings</em> | <em>PHP</em> | <em>PHPUnit</em> &gt; <em>Local</em> &gt; <em>Use custom autoloader.php</em>: <code>~dev_rating/modules/unittest/vendor/autoload.php</code>.</p></li>
-</ul>
-
-<h4 id="%D0%BD%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2">
-<a id="user-content-Написание-тестов" class="anchor" href="#%D0%9D%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2" aria-hidden="true"><span class="octicon octicon-link"></span></a>Написание тестов</h4>
-</article></body></html>
\ No newline at end of file
diff --git a/doc/dev/testing/phpunit.md b/doc/dev/testing/phpunit.md
deleted file mode 100644
index d39f03e9f138a6c602c748cf3ba05c229e40ad74..0000000000000000000000000000000000000000
--- a/doc/dev/testing/phpunit.md
+++ /dev/null
@@ -1,71 +0,0 @@
-# PHPUnit
-
-[PHPUnit](https://phpunit.de/) — фреймворк для юнит-тестирования приложений. С некоторого времени стал поддерживать и поведенческие тесты (BDD подход). Нужно учитывать, что из-за MVC модели Kohana, нужно использовать _непрямой_ доступ к классам. Почитать об этом можно в разделе [Kohana integration](../index.html#kohana-integration).
-
-> Возможно здесь появится иформация о TDD/BDD и прочих штуках
-
-## Composer
-
-[Composer](https://getcomposer.org/) — менеджер зависимостей для приложений, написанных на PHP. Сильно облегчает задачу обновления всех подключенных к проекту библиотек и фрейморков.
-
-[Скачиваем](https://getcomposer.org/Composer-Setup.exe) себе на машину, при установке указываем путь `OpenServer/modules/php/PHP-5.5/php.exe` — далее он самостоятельно добавится в PATH так, что вы сможете вызвать его из любой директории.
-
-Запускаем OpenServer, в меню выбираем: _Дополнительно_ | _Консоль_. Команда [`self-update`](https://getcomposer.org/doc/03-cli.md#self-update) обновит Composer до последней версии.
-
-```
-$ php w:\modules\php\PHP-5.5\composer.phar self-update
-```
-
-## Установка вне проекта
-
-```bash
-$ composer global require "phpunit/phpunit=4.5.*"
-```
-
-Composer подключится к репозиторию, скачает и установит пакеты.
-
-Открываем `OpenServer/modules/php/PHP-5.5/`, создаём файл `phpunit.bat` в кодировке CP886 (Cyrillic Windows), со следующим содержимым (`%username%` — имя пользователя):
-
-```bash
-@ECHO OFF
-php "C:/Users/%username%/AppData/Roaming/Composer/vendor/phpunit/phpunit/phpunit" %*
-```
-
-Пробуем работоспособность в консоли: `$ phpunit`. В ответ выпадет список параметров и строка:
-
-```
-PHPUnit 4.5.0 by Sebastian Bergmann and contributors.
-```
-
-
-#### Как запустить тесты
-
-Согласно [туториалу](https://phpunit.de/manual/current/en/writing-tests-for-phpunit.html) пишем тест:
-
-```php
-<?php
-class FailureTest extends PHPUnit_Framework_TestCase
-{
-    public function testOne() {
-        $this->assertTrue(FALSE);  // Здесь будет ошибка
-    }
-}
-?>
-```
-
-Я положил его в файл `OpenServer/domains/tests.com/test.php`, соответственно открываем консоль, переходим в директорию с помощью команды `cd domains/tests.com` и запускаем тест: `$ phpunit test.php`.
-
-
-## Интеграция с PHPStorm
-
-Гайд установки от JetBrains можно почитать [здесь](https://www.jetbrains.com/phpstorm/help/enabling-phpunit-support.html). Краткое содержание:
-
-* Открываем проект, _Tools_ | _Composer_ | _Init Composer_, указываем путь `./modules/php/PHP-5.5/`, во второй строке `./modules/php/PHP-5.5/composer.pchar`.
-
-* PHPUnit **не должен** быть под системой контроля версий. Проверьте наличие папки `~dev_rating/modules/unittest/vendor`, и если её нет, то переходим в _Tools_ | _Composer_ | _Add dependency_. Указываем `phpunit/phpunit` > _Install_.
-
-* Далее _Settings_ | _PHP_ | _PHPUnit_ > _Local_ > _Use custom autoloader.php_: `~dev_rating/modules/unittest/vendor/autoload.php`.
-
-
-#### Написание тестов
-
diff --git a/init_data/mmcs faculty/reports/chessWithIds.jasper b/init_data/mmcs faculty/reports/chessWithIds.jasper
new file mode 100644
index 0000000000000000000000000000000000000000..616540c410c79c70feea92fb5fa61242c3f8ccae
Binary files /dev/null and b/init_data/mmcs faculty/reports/chessWithIds.jasper differ
diff --git a/init_data/mmcs faculty/reports/chessWithWords.jasper b/init_data/mmcs faculty/reports/chessWithWords.jasper
new file mode 100644
index 0000000000000000000000000000000000000000..68faa288ee696402104e9e9f2393173a0da761e9
Binary files /dev/null and b/init_data/mmcs faculty/reports/chessWithWords.jasper differ
diff --git a/init_data/mmcs faculty/reports/groupList.jasper b/init_data/mmcs faculty/reports/groupList.jasper
new file mode 100644
index 0000000000000000000000000000000000000000..8ffa36b164deda385148cc7931fd57bb5fd9baff
Binary files /dev/null and b/init_data/mmcs faculty/reports/groupList.jasper differ
diff --git a/init_data/mmcs faculty/reports/sheet.jasper b/init_data/mmcs faculty/reports/sheet.jasper
new file mode 100644
index 0000000000000000000000000000000000000000..5490400c2c87abc8888ff701b3934e5af74fc31d
Binary files /dev/null and b/init_data/mmcs faculty/reports/sheet.jasper differ
diff --git a/java/AdditionalDBAdm/.classpath b/java/AdditionalDBAdm/.classpath
new file mode 100644
index 0000000000000000000000000000000000000000..c0f4868f567875dbdf0bfe783d13efb8a6cc7947
--- /dev/null
+++ b/java/AdditionalDBAdm/.classpath
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/java/AdditionalDBAdm/.project b/java/AdditionalDBAdm/.project
new file mode 100644
index 0000000000000000000000000000000000000000..61fc100c6843591b73a238f8f7bc44cf057c4417
--- /dev/null
+++ b/java/AdditionalDBAdm/.project
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>AdditionalDBAdm</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.common.project.facet.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.validation.validationbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+		<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
+	</natures>
+</projectDescription>
diff --git a/java/AdditionalDBAdm/.settings/.jsdtscope b/java/AdditionalDBAdm/.settings/.jsdtscope
new file mode 100644
index 0000000000000000000000000000000000000000..b72a6a47b2ec21bba2fa061e92969554ed8d5d60
--- /dev/null
+++ b/java/AdditionalDBAdm/.settings/.jsdtscope
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src/main/webapp"/>
+	<classpathentry kind="src" path="target/m2e-wtp/web-resources"/>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.WebProject">
+		<attributes>
+			<attribute name="hide" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>
+	<classpathentry kind="output" path=""/>
+</classpath>
diff --git a/java/AdditionalDBAdm/.settings/org.eclipse.core.resources.prefs b/java/AdditionalDBAdm/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..abdea9ac032d4655898933f93050f48bf9581d14
--- /dev/null
+++ b/java/AdditionalDBAdm/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,4 @@
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/main/resources=UTF-8
+encoding/<project>=UTF-8
diff --git a/java/AdditionalDBAdm/.settings/org.eclipse.jdt.core.prefs b/java/AdditionalDBAdm/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..443e08599a2e61e27329fbffd44d862d8675dde4
--- /dev/null
+++ b/java/AdditionalDBAdm/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.7
diff --git a/java/AdditionalDBAdm/.settings/org.eclipse.m2e.core.prefs b/java/AdditionalDBAdm/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..f897a7f1cb2389f85fe6381425d29f0a9866fb65
--- /dev/null
+++ b/java/AdditionalDBAdm/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/java/AdditionalDBAdm/.settings/org.eclipse.wst.common.component b/java/AdditionalDBAdm/.settings/org.eclipse.wst.common.component
new file mode 100644
index 0000000000000000000000000000000000000000..d94e840cd635af87767c442d419bce96badd25a2
--- /dev/null
+++ b/java/AdditionalDBAdm/.settings/org.eclipse.wst.common.component
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
+    <wb-module deploy-name="AdditionalDBAdm">
+        <wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
+        <wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
+        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
+        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
+        <property name="context-root" value="AdditionalDBAdm"/>
+        <property name="java-output-path" value="/AdditionalDBAdm/target/classes"/>
+    </wb-module>
+</project-modules>
diff --git a/java/AdditionalDBAdm/.settings/org.eclipse.wst.common.project.facet.core.xml b/java/AdditionalDBAdm/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c6144e856bf67c99b8a207b877f98737f03a3852
--- /dev/null
+++ b/java/AdditionalDBAdm/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <fixed facet="wst.jsdt.web"/>
+  <installed facet="java" version="1.7"/>
+  <installed facet="jst.web" version="3.0"/>
+  <installed facet="wst.jsdt.web" version="1.0"/>
+</faceted-project>
diff --git a/java/AdditionalDBAdm/.settings/org.eclipse.wst.jsdt.ui.superType.container b/java/AdditionalDBAdm/.settings/org.eclipse.wst.jsdt.ui.superType.container
new file mode 100644
index 0000000000000000000000000000000000000000..3bd5d0a4803967bc0bf72a7dd66d7e292ed2e586
--- /dev/null
+++ b/java/AdditionalDBAdm/.settings/org.eclipse.wst.jsdt.ui.superType.container
@@ -0,0 +1 @@
+org.eclipse.wst.jsdt.launching.baseBrowserLibrary
\ No newline at end of file
diff --git a/java/AdditionalDBAdm/.settings/org.eclipse.wst.jsdt.ui.superType.name b/java/AdditionalDBAdm/.settings/org.eclipse.wst.jsdt.ui.superType.name
new file mode 100644
index 0000000000000000000000000000000000000000..05bd71b6ec2c1982d1e8a5653073281994564ae8
--- /dev/null
+++ b/java/AdditionalDBAdm/.settings/org.eclipse.wst.jsdt.ui.superType.name
@@ -0,0 +1 @@
+Window
\ No newline at end of file
diff --git a/java/AdditionalDBAdm/.settings/org.eclipse.wst.validation.prefs b/java/AdditionalDBAdm/.settings/org.eclipse.wst.validation.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..04cad8cb752a9761c4e5167d0301d3a27674430f
--- /dev/null
+++ b/java/AdditionalDBAdm/.settings/org.eclipse.wst.validation.prefs
@@ -0,0 +1,2 @@
+disabled=06target
+eclipse.preferences.version=1
diff --git a/java/AdditionalDBAdm/AdditionalDBAdm-1.0-SNAPSHOT.war b/java/AdditionalDBAdm/AdditionalDBAdm-1.0-SNAPSHOT.war
new file mode 100644
index 0000000000000000000000000000000000000000..424c09e0b65093b94f58a78b6aec15dafc32b8d2
Binary files /dev/null and b/java/AdditionalDBAdm/AdditionalDBAdm-1.0-SNAPSHOT.war differ
diff --git a/java/AdditionalDBAdm/src/main/java/Configs/Actions/ActionsDescs.java b/java/AdditionalDBAdm/src/main/java/Configs/Actions/ActionsDescs.java
index db16fc51e866aa0212ca999c28635cd2dfb7d2ba..543b7ce7b2f335c2c5509078ecfef31430ff6ca6 100644
--- a/java/AdditionalDBAdm/src/main/java/Configs/Actions/ActionsDescs.java
+++ b/java/AdditionalDBAdm/src/main/java/Configs/Actions/ActionsDescs.java
@@ -16,6 +16,9 @@ import org.xml.sax.SAXException;
 import Configs.BaseConfigParser;
 import Configs.Exceptions.ParserException;
 import DataBase.Table;
+import DataBaseConnection.DataBaseInterface;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
 
 public class ActionsDescs extends BaseConfigParser 
 {
@@ -68,7 +71,8 @@ public class ActionsDescs extends BaseConfigParser
 			if(!filterValueElt.hasAttribute("filterName"))
 				throw new ParserException("Not fount attr filterName in "+filterValueElt.toString());
 			
-			String filterName=filterValueElt.getAttribute("filterName");
+			String filterName=filterValueElt.getAttribute("filterName"),
+                               filterType=filterValueElt.getAttribute("type");
 			ArrayList<Element> items=new ArrayList<>();
 			NodeList itemsNodes=filterValueElt.getChildNodes();
 			for(int j=0; j<itemsNodes.getLength(); ++j)
@@ -77,7 +81,7 @@ public class ActionsDescs extends BaseConfigParser
 				//	System.out.println("nameNode="+itemsNodes.item(j).getNodeName()+"; nodeValue="+itemsNodes.item(j).getNodeValue());
 					items.add((Element)itemsNodes.item(j));
 			}
-			filtersValues.add(new FilterValue(filterName, items));
+			filtersValues.add(new FilterValue(filterName, filterType, items));
 		}
 		ActionDesc actionDesc=new SwitchTableActionDesc(name, viewName, target, type, dstTable, filtersValues);
 		return actionDesc;
@@ -168,7 +172,7 @@ public class ActionsDescs extends BaseConfigParser
 		return res.toString();
 	}
 	
-	public synchronized Map<String, String> getFiltersParamForSwitchTable(Table table, HttpServletRequest request) throws Exception
+	public synchronized Map<String, String> getFiltersParamForSwitchTable(DataBaseInterface dbInterf, Table table, HttpServletRequest request) throws Exception//, Map<String, String> columnsValues)
 	{
 		Map<String, String> res=new HashMap<String, String>();
 		
@@ -178,6 +182,9 @@ public class ActionsDescs extends BaseConfigParser
 			SwitchTableActionDesc actionDesc=(SwitchTableActionDesc)bActionDesc;
 			for(FilterValue filterValue : actionDesc.getFiltersValues())
 			{
+                            switch(filterValue.getType())
+                            {
+                            case "text":
 				StringBuilder value=new StringBuilder("");
 				for(Element item : filterValue.getItems())
 				switch(item.getTagName())
@@ -193,6 +200,41 @@ public class ActionsDescs extends BaseConfigParser
 					break;
 				}
 				res.put(filterValue.getFilterName(), value.toString());
+                                break;
+                            case "select":
+                                try(PreparedStatement prepState=dbInterf.getPreparedStatement(filterValue.getSelectValue()))
+                                {
+                                    int i=1;
+                                    for(FilterValue.SelectParam param : filterValue.getParams())
+                                    {
+                                        String colValue=request.getParameter(param.getColName());
+                                        if(colValue!=null)
+                                        switch(param.getType())
+                                        {
+                                        case "int":
+                                            
+                                                prepState.setInt(i, Integer.parseInt(colValue));
+                                            
+                                            break;
+                                        case "string":
+                                            prepState.setString(i, colValue);
+                                            break;
+                                        }
+                                        else
+                                           throw new ParserException("Request not contain "+param.getColName()+" value.");
+                                        ++i;
+                                    }
+                                    try(ResultSet resSet=prepState.executeQuery())
+                                    {
+                                        if(resSet.next() && resSet.getMetaData().getColumnCount()>0)
+                                            res.put(filterValue.getFilterName(), resSet.getString(1));
+                                        else
+                                            throw new ParserException("Result set is empty or columns count=0 in "+filterValue.getSelectValue());
+                                    }
+                                }
+                                
+                                break;
+                            }
 			}
 			return res;
 		}
diff --git a/java/AdditionalDBAdm/src/main/java/Configs/Actions/FilterValue.java b/java/AdditionalDBAdm/src/main/java/Configs/Actions/FilterValue.java
index 63fdfdbf9be12218e733326c669f78f642e192b3..56902601ba9b46e212e26bfd5382efe17432d754 100644
--- a/java/AdditionalDBAdm/src/main/java/Configs/Actions/FilterValue.java
+++ b/java/AdditionalDBAdm/src/main/java/Configs/Actions/FilterValue.java
@@ -3,20 +3,60 @@
 package Configs.Actions;
 
 import java.util.ArrayList;
+import java.util.List;
 
 import org.w3c.dom.Element;
 
 public class FilterValue 
 {
-	String filterName;
+    public class SelectParam
+    {
+        String colName,
+               type;
+        public SelectParam(String colName, String type)
+        {
+            this.colName=colName;
+            this.type=type;
+        }
+        public String getColName() { return colName; }
+        public String getType() { return type; }
+    }
+    
+	String filterName,
+               type;
+        
 	ArrayList<Element> items;
-	
-	public FilterValue(String filterName, ArrayList<Element> items)
+	String selectValue;
+        List<SelectParam> params;
+        
+	public FilterValue(String filterName,String type, ArrayList<Element> items)
 	{
 		this.filterName=filterName;
 		this.items=items;
+                this.type=type;
+                parseItems();
 	}
+        
+        private void parseItems()
+        {
+            params=new ArrayList();
+            for(Element item : items)
+            {
+                switch(item.getTagName())
+                {
+                case "selectValue":
+                    selectValue=item.getTextContent();
+                    break;
+                case "param":
+                    params.add(new SelectParam(item.getAttribute("colName"), item.getAttribute("type")));
+                    break;
+                }
+            }
+        }
 	
 	public String getFilterName() { return filterName; }
 	public ArrayList<Element> getItems() { return items; }
+        public String getType() { return type; }
+        public String getSelectValue() { return selectValue; }
+        public List<SelectParam> getParams() { return params; }
 }
diff --git a/java/AdditionalDBAdm/src/main/java/Configs/AuthConfig.java b/java/AdditionalDBAdm/src/main/java/Configs/AuthConfig.java
index 765025a6003eacc056a6ae5ae1d20497bc7d86e4..6f95601bd70e9a7ba3ee2605c6bc114208de6b3d 100644
--- a/java/AdditionalDBAdm/src/main/java/Configs/AuthConfig.java
+++ b/java/AdditionalDBAdm/src/main/java/Configs/AuthConfig.java
@@ -30,7 +30,7 @@ public class AuthConfig extends BaseConfigParser
 					userRoleField,
 					accountIDField;
 	
-	private Map<String, ArrayList<String> > mapping;
+	private Map<String, ArrayList<Integer> > mapping;
 	
 	public class Account
 	{
@@ -93,7 +93,7 @@ public class AuthConfig extends BaseConfigParser
 			throw new NotFoundElementException("Element openKey not found in "+authConfigFName+".");
 		openKey=authConfig.getElementsByTagName("openKey").item(0).getTextContent();
 		
-		mapping=new HashMap<String, ArrayList<String> >();
+		mapping=new HashMap<String, ArrayList<Integer> >();
 		NodeList requestMappings=authConfig.getElementsByTagName("requestMapping");
 		for(int i=0; i<requestMappings.getLength(); ++i)
 		{
@@ -101,10 +101,10 @@ public class AuthConfig extends BaseConfigParser
 			if(url==null)
 				url="/";
 			
-			ArrayList<String> listRoles=new ArrayList<>();
+			ArrayList<Integer> listRoles=new ArrayList<>();
 			NodeList roles=((Element)requestMappings.item(i)).getElementsByTagName("userRole");
 			for(int j=0; j<roles.getLength(); ++j)
-				listRoles.add(roles.item(j).getTextContent());
+				listRoles.add(Integer.parseInt(roles.item(j).getTextContent()));
 			
 			mapping.put(url,  listRoles);
 		}
@@ -154,8 +154,8 @@ public class AuthConfig extends BaseConfigParser
 		}
 	}
 	
-	public ArrayList<String> getRolesForUrl(String url)
+	public ArrayList<Integer> getRolesForUrl(String url)
 	{
-		return (ArrayList<String>)mapping.get(url).clone();
+		return (ArrayList<Integer>)mapping.get(url).clone();
 	}
 }
diff --git a/java/AdditionalDBAdm/src/main/java/Configs/CreateRowsDescs.java b/java/AdditionalDBAdm/src/main/java/Configs/CreateRowsDescs.java
index 47c663d62f8ae9af76983b99f6579e46b6f77025..e3128e437606b3e2db29716b8d69134f6b4484e0 100644
--- a/java/AdditionalDBAdm/src/main/java/Configs/CreateRowsDescs.java
+++ b/java/AdditionalDBAdm/src/main/java/Configs/CreateRowsDescs.java
@@ -42,7 +42,7 @@ public class CreateRowsDescs extends BaseConfigParser
 				if(paramValue.length>0)
 					callState.setString(i+1+1, paramValue[0]);
 				else
-					return "<td>не хватате параметра "+paramsOrder.get(i)+" для вызова процедуры</td>";
+					return "<td>не хватате параметра "+paramsOrder.get(i)+" для вызова процедуры</td>";
 			}
 			callState.executeQuery();
 			int createProcOut=-2;
@@ -55,17 +55,17 @@ public class CreateRowsDescs extends BaseConfigParser
 			switch(createProcOut)
 			{
 			case 0:
-				return "<td>Успешно добавлено</td>";
+				return "<td>Успешно добавлено</td>";
 			case -1:
-				return "<td>Не удалось добавить</td>";
+				return "<td>Не удалось добавить</td>";
 			case -2:
-				return "<td>Результат неизвестен, callState=null</td>";
+				return "<td>Результат неизвестен, callState=null</td>";
 			default:
-				return "<td>Операция завершилась с кодом "+createProcOut+"</td>";
+				return "<td>Операция завершилась с кодом "+createProcOut+"</td>";
 			}
 		}
 		else
-			return "<td>Ни одна таблица не была открыта для добавления.</td>";
+			return "<td>Ни одна таблица не была открыта для добавления.</td>";
 	}
 	
 	public synchronized String getCreateRowHTMLForTable(DataBaseInterface dbInterf, Table table) throws NotFoundElementException, SQLException, NotFoundAttrException
@@ -81,7 +81,7 @@ public class CreateRowsDescs extends BaseConfigParser
 			createRowsDescs=((Element) document.getElementsByTagName("createRowsDescs").item(0)).getElementsByTagName("createRowDesc");
 		}
 		else
-			throw new NotFoundElementException("не найден элемент createRowsDescs в "+document.toString());
+			throw new NotFoundElementException("не найден элемент createRowsDescs в "+document.toString());
 		
 		int i=0;
 		while(i<createRowsDescs.getLength())
@@ -94,14 +94,14 @@ public class CreateRowsDescs extends BaseConfigParser
 		
 		if(i>=createRowsDescs.getLength())
 		{
-			res.append("<td>не найдено описание строки для создания в файле createRowsDescs</td>");
+			res.append("<td>не найдено описание строки для создания в файле createRowsDescs</td>");
 			return res.toString();
 		}
 		
 		if(((Element)createRowsDescs.item(i)).getElementsByTagName("call").getLength()>0)
 			createProcCall=((Element)createRowsDescs.item(i)).getElementsByTagName("call").item(0).getTextContent();
 		else
-			throw new NotFoundElementException("Не найдена процедура создания нового значения для таблицы "+table.GetName());
+			throw new NotFoundElementException("Не найдена процедура создания нового значения для таблицы "+table.GetName());
 		
 		StringBuilder namesRow=new StringBuilder("<tr class='"+WebConstants.HEADER_TR_CLASS+"'>"),
 					  inputsRow=new StringBuilder("<tr id='addRow'>");
@@ -121,7 +121,7 @@ public class CreateRowsDescs extends BaseConfigParser
 			}
 			else
 			{
-				res.append("<td>в описании поля отсутствует название в файле createRowsDescs </td>");
+				res.append("<td>в описании поля отсутствует название в файле createRowsDescs </td>");
 				return res.toString();
 			}
 			if((bNode=fields.item(j).getAttributes().getNamedItem("viewName"))!=null)
@@ -142,12 +142,12 @@ public class CreateRowsDescs extends BaseConfigParser
 						isKey=true;
 						if((bNode=childField.item(k).getAttributes().getNamedItem("relatedTable"))==null)
 						{
-							res.append("<td>не найден параметр relatedTable в "+childField.item(k).toString()+"</td>");
+							res.append("<td>не найден параметр relatedTable в "+childField.item(k).toString()+"</td>");
 							return res.toString();
 						}
 						if((bNode=childField.item(k).getAttributes().getNamedItem("foreignKey"))==null)
 						{
-							res.append("<td>не найден параметр foreignKey в "+childField.item(k).toString()+"</td>");
+							res.append("<td>не найден параметр foreignKey в "+childField.item(k).toString()+"</td>");
 							return res.toString();
 						}
 
@@ -160,7 +160,7 @@ public class CreateRowsDescs extends BaseConfigParser
 					inputsRow.append("<td><input name='"+name+"' type='text'/></td>");
 				break;
 			default:
-				inputsRow.append("<td>неизвестный тип="+type+"</td");
+				inputsRow.append("<td>неизвестный тип="+type+"</td");
 			}
 			
 		}
@@ -170,7 +170,7 @@ public class CreateRowsDescs extends BaseConfigParser
 		res.append(namesRow);
 		res.append(inputsRow);
 		
-		res.append("<tr><td><div class='baseButton smallButton' id='addButton'>Добавить</div></td></tr>");
+		res.append("<tr><td><div class='baseButton smallButton' id='addButton'>Добавить</div></td></tr>");
 		
 		return res.toString();
 	}
diff --git a/java/AdditionalDBAdm/src/main/java/Configs/KeyProcessing.java b/java/AdditionalDBAdm/src/main/java/Configs/KeyProcessing.java
index b5736b433bf607ebd8fd70b8f37b413d6197f55a..ad44e516f3bd74219121d32e286255a53d2c5b86 100644
--- a/java/AdditionalDBAdm/src/main/java/Configs/KeyProcessing.java
+++ b/java/AdditionalDBAdm/src/main/java/Configs/KeyProcessing.java
@@ -25,17 +25,17 @@ public class KeyProcessing
 		if(keyAttr!=null)
 			relatedTable=keyAttr.getNodeValue();
 		else
-			throw new NotFoundAttrException("Не хватает параметра relatedTable в "+key.toString());
+			throw new NotFoundAttrException("Не хватает параметра relatedTable в "+key.toString());
 		
 		keyAttr=key.getAttributes().getNamedItem("colName");
 		if(keyAttr==null)
-			throw new NotFoundAttrException("Не хватает параметра colName в "+key.toString());
+			throw new NotFoundAttrException("Не хватает параметра colName в "+key.toString());
 		
 		keyAttr=key.getAttributes().getNamedItem("foreignKey");
 		if(keyAttr!=null)
 			foreignKey=keyAttr.getNodeValue();
 		else
-			throw new NotFoundAttrException("Не хватает параметра foreignKey в "+key.toString());
+			throw new NotFoundAttrException("Не хватает параметра foreignKey в "+key.toString());
 		
 		/*if(key.getAttributes().getNamedItem("viewName")==null)
 			System.out.println("viewName=null");
@@ -66,7 +66,7 @@ public class KeyProcessing
 				if(kChilds.item(i).getAttributes().getNamedItem("colName")!=null)
 					kColName=kChilds.item(i).getAttributes().getNamedItem("colName").getNodeValue();
 				else
-					throw new NotFoundAttrException("Не хватает параметра colName в "+kChilds.item(i).toString());
+					throw new NotFoundAttrException("Не хватает параметра colName в "+kChilds.item(i).toString());
 				
 				try(Statement statement=dbInterf.getStatement())
 				{
diff --git a/java/AdditionalDBAdm/src/main/java/Configs/KeysDesc.java b/java/AdditionalDBAdm/src/main/java/Configs/KeysDesc.java
index 92c7e4553b9b8ca3aec31d5b1096093ab3f521b1..52f45eaadf01959d503ec9b8155805e33e399850 100644
--- a/java/AdditionalDBAdm/src/main/java/Configs/KeysDesc.java
+++ b/java/AdditionalDBAdm/src/main/java/Configs/KeysDesc.java
@@ -228,9 +228,11 @@ public class KeysDesc extends BaseConfigParser
 
             ArrayList<String> columnsOrder = table.getColumnsOrder();
 
+            System.out.println("Set title col order begin.");
             for (i = 0; i < columnsOrder.size(); ++i)
             {
                 String cName = ((ColumnDesc) (table.GetColumnsDescs().get(columnsOrder.get(i)))).getViewName();
+                System.out.println(String.format("cName[%s]=%s; colOrder[%s]=%s", i, cName, i, columnsOrder.get(i)));
                 if (cName == null)
                 {
                     cName = rsMD.getColumnName(i + 1);
diff --git a/java/AdditionalDBAdm/src/main/java/RequestProcessing/RequestProcessing.java b/java/AdditionalDBAdm/src/main/java/RequestProcessing/RequestProcessing.java
index 0495963beb8445c6bf5fd946679568f52b8ae6c3..b51b65d8aa4814476d1e989912de20eb287f627d 100644
--- a/java/AdditionalDBAdm/src/main/java/RequestProcessing/RequestProcessing.java
+++ b/java/AdditionalDBAdm/src/main/java/RequestProcessing/RequestProcessing.java
@@ -260,6 +260,18 @@ public class RequestProcessing
         return doc.html();
     }
     
+    private String getWelcomePage(String contextPath, String errorMsg) throws IOException
+    {
+        Document doc = Jsoup.parse(new File(realPath + File.separator + resourcePath + "allRights.html"), htmlEncoding);
+        addServerUrlVariableToScript(contextPath, doc);
+        Element errorOut = doc.body().getElementById("errorOut");
+        if (errorMsg!=null && errorOut != null)
+        {
+            errorOut.html(errorMsg);
+        }
+        return doc.html();
+    }
+    
     private void processingError(Exception exception, String messageForUser, int errorCode, HttpServletResponse response)
     {
     	if(exception!=null)
@@ -294,13 +306,23 @@ public class RequestProcessing
                 response.sendRedirect(request.getContextPath()+"/login");
             try 
             {	
-                res.append(getHtmlMainPage(request.getRequestURL().toString(), loginInfoParser.getLoginInfo(defaultDBName), false)); 
+                if(SecurityProvider.checkUserRights(authConfig, account, path))
+                    res.append(getHtmlMainPage(request.getRequestURL().toString(), loginInfoParser.getLoginInfo(defaultDBName), false)); 
+                else
+                    res.append(getWelcomePage(request.getRequestURL().toString(), "У Вас недостаточно прав для входа."));
             } 
             catch (Exception e) 
             {	
                 processingError(e, "Не удалось загрузить главную страницу.", HttpServletResponse.SC_NOT_FOUND, response); 
             }
             break;
+        case "/default/logout":
+            request.getSession().setAttribute("account", null);
+            response.sendRedirect(request.getContextPath()+"/login");
+            break;
+        case "/welcome":
+            res.append(getWelcomePage(request.getServletPath()/*getContextPath()*/, ""));
+            break;
         default:
             res.append("path="+path+"; requestedUri="+request.getRequestURI()+"; contextPath="+request.getContextPath());
         }
@@ -315,10 +337,6 @@ public class RequestProcessing
     	
     	// authorization
     	Account account=(Account)request.getSession().getAttribute("account");
-    	/////////
-    	/*if(request.getRequestURI().contains("noreg"))
-    		request.getSession().setAttribute("account", (account=authConfig.new Account("login", "password", "role")));*/
-    	/////////
     	if(account==null)
     	{
     		SecurityProvider.redirectToAuthPage(authConfig, request, response);
@@ -882,7 +900,7 @@ public class RequestProcessing
 		    	case SWITCH_TABLE:    		
 			    	try 
 			    	{
-						Map<String, String> filtersParams=actionsDescs.getFiltersParamForSwitchTable(tTable, request);
+						Map<String, String> filtersParams=actionsDescs.getFiltersParamForSwitchTable(dataBaseInterf, tTable, request);
 						String dstTable=actionsDescs.getDstTableName(tTable, request);
 						res.append(selectEditableTable(dstTable, numRowsInPage, filtersParams));
 						/*tTable=tablesDescs.getTable(dataBaseInterf, dstTable);
diff --git a/java/AdditionalDBAdm/src/main/java/RequestProcessing/SecurityProvider.java b/java/AdditionalDBAdm/src/main/java/RequestProcessing/SecurityProvider.java
index e18e9287e8188f16fdc6183fb6fd3035c3ea3e4d..b4005384ce748a873795a80744afdade3227e612 100644
--- a/java/AdditionalDBAdm/src/main/java/RequestProcessing/SecurityProvider.java
+++ b/java/AdditionalDBAdm/src/main/java/RequestProcessing/SecurityProvider.java
@@ -29,4 +29,17 @@ class SecurityProvider
 		System.out.println("redirect to:"+authUrl); 	
 		response.sendRedirect(authUrl);
 	}
+         
+        static public boolean checkUserRights(AuthConfig authConfig, AuthConfig.Account account, String url)
+        {
+            System.out.println("==Checking user rights.==");
+            System.out.println("userRole="+account.getRole());
+            for(Integer role : authConfig.getRolesForUrl(url))
+            {
+                System.out.println("matching "+account.getRole()+" and "+role+"; result="+(role.intValue() & account.getRole()));
+                if((role.intValue() & account.getRole())!=0)
+                    return true;
+            }
+            return false;
+        }
 }
diff --git a/java/AdditionalDBAdm/src/main/webapp/WEB-INF/configs/authConfig.xml b/java/AdditionalDBAdm/src/main/webapp/WEB-INF/configs/authConfig.xml
index 02725121d30185ac07bb800b604d9bac45bdb080..67981809d3c6ae64770c051fa88f518bc8559e31 100644
--- a/java/AdditionalDBAdm/src/main/webapp/WEB-INF/configs/authConfig.xml
+++ b/java/AdditionalDBAdm/src/main/webapp/WEB-INF/configs/authConfig.xml
@@ -9,10 +9,7 @@
 	<authPageUrl>http://users.mmcs.sfedu.ru/~dev_rating/java_authentication</authPageUrl>
 	<signPage>http://users.mmcs.sfedu.ru/~dev_rating/</signPage>
 	<getSessionCall>{ call GetSession( ?, ?, ?, ? ) }</getSessionCall>
-	<requestMapping url="/TestMySQL/default">
-		<userRole>3</userRole>
-	</requestMapping>
-	<requestMapping url="/TestMySQL/MainServlet">
-		<userRole>3</userRole>
+	<requestMapping url="/default">
+		<userRole>8</userRole>
 	</requestMapping>
 </authConfig>
diff --git a/java/AdditionalDBAdm/src/main/webapp/WEB-INF/configs/mmcs_rating/actionsDescs.xml b/java/AdditionalDBAdm/src/main/webapp/WEB-INF/configs/mmcs_rating/actionsDescs.xml
index 38b223021542437a6048006c99ff2b2814dd25c7..95554a3de09ce2358a9277d041690554e7c515fa 100644
--- a/java/AdditionalDBAdm/src/main/webapp/WEB-INF/configs/mmcs_rating/actionsDescs.xml
+++ b/java/AdditionalDBAdm/src/main/webapp/WEB-INF/configs/mmcs_rating/actionsDescs.xml
@@ -3,7 +3,7 @@
 	<tableActions nameInDB="teachers">
 		<action name="showDisciplines" viewName="Дисциплины" target="one" type="switchTable">
 			<dstTable>disciplines</dstTable>
-			<filterValue filterName="teacherEqual">
+			<filterValue filterName="teacherEqual"  type="text">>
 				<value name="LastName"/>
 				<text> </text>
 				<value name="FirstName"/>
@@ -19,7 +19,7 @@
 		</action>
                 <action name="showGroup" viewName="Показать группу" target="one" type="switchTable">
                     <dstTable>study_groups</dstTable>
-                    <filterValue filterName="studentNameEqual">
+                    <filterValue filterName="studentNameEqual"  type="text">>
                         <value name="LastName"/>
                         <text> </text>
                         <value name="FirstName"/>
@@ -28,4 +28,22 @@
                     </filterValue>
                 </action>
 	</tableActions>
+        <tableActions nameInDB="study_groups">
+            <action name="showStudents" viewName="Показать студентов" target="one" type="switchTable">
+                <dstTable>students</dstTable>
+                <filterValue filterName="facultyEqual" type="select">
+                    <selectValue>
+                        SELECT faculties.ID 
+                            FROM specializations
+                            JOIN faculties
+                            ON specializations.FacultyID=faculties.ID
+                            WHERE specializations.ID=?
+                    </selectValue>
+                    <param colName="SpecializationID" type="int"></param>
+                </filterValue>
+                <filterValue filterName="specEqual" type="text">
+                    <value name="SpecializationID"/>
+                </filterValue>
+            </action>
+        </tableActions>
 </actions>
\ No newline at end of file
diff --git a/java/AdditionalDBAdm/src/main/webapp/WEB-INF/configs/mmcs_rating/filtersDescs.xml b/java/AdditionalDBAdm/src/main/webapp/WEB-INF/configs/mmcs_rating/filtersDescs.xml
index b894924444dbfdd1dd8d155817cfa41fd45a3550..c153979597196f9faceb8088910e239cbc036d43 100644
--- a/java/AdditionalDBAdm/src/main/webapp/WEB-INF/configs/mmcs_rating/filtersDescs.xml
+++ b/java/AdditionalDBAdm/src/main/webapp/WEB-INF/configs/mmcs_rating/filtersDescs.xml
@@ -50,10 +50,8 @@
                     <text> РіРѕРґР°</text>
                 </key>
                 <whereEqual>
-                    (SELECT COUNT(*) FROM students_groups
-                        JOIN semesters
-                        ON students_groups.SemesterID=%semesterEqual
-                        WHERE students_groups.GroupID=study_groups.ID)>0
+                    (SELECT COUNT(*) FROM students_groups 
+                    WHERE students_groups.SemesterID=%semesterEqual)>0
                 </whereEqual>
             </equal>
         </tableFilters>
@@ -68,7 +66,8 @@
                 <whereEqual>
                     (SELECT COUNT(*) FROM specializations 
                     JOIN study_groups ON SpecializationID=specializations.ID
-                    WHERE StudyGroupID=study_groups.ID AND specializations.FacultyID=%facultyEqual)>0
+                    JOIN students_groups ON study_groups.ID=students_groups.GroupID
+                    WHERE students_groups.StudentID=students.ID AND specializations.FacultyID=%facultyEqual)>0
                 </whereEqual>
                 <equal name="specEqual" viewName="Специализация" type="valuesList" table="specializations" pKey="ID">
                     <selectEqual>
@@ -80,7 +79,8 @@
                     <whereEqual>
                         (SELECT COUNT(*) FROM specializations 
                         JOIN study_groups ON SpecializationID=specializations.ID
-                        WHERE StudyGroupID=study_groups.ID AND specializations.FacultyID=%facultyEqual AND specializations.ID=%specEqual)>0
+                        JOIN students_groups ON study_groups.ID=students_groups.GroupID
+                        WHERE students_groups.StudentID=students.ID AND specializations.FacultyID=%facultyEqual AND specializations.ID=%specEqual)>0
                     </whereEqual>
                 </equal>	
             </equal>
@@ -95,8 +95,9 @@
                     <value colName="Degree"></value>
                 </key>
                 <whereEqual>
-                    (SELECT COUNT(*) FROM study_groups 
-                    WHERE study_groups.ID=StudyGroupID AND GradeID=%gradeEqual)>0
+                    (SELECT COUNT(*) FROM study_groups
+                    JOIN students_groups ON study_groups.ID=students_groups.GroupID
+                    WHERE students_groups.StudentID=students.ID AND GradeID=%gradeEqual)>0
                 </whereEqual>
             </equal>
 		
@@ -104,15 +105,15 @@
                 <ref name="specEqual"/>
                 <ref name="gradeEqual"/>
                 <selectEqual>
-                    SELECT study_groups.ID FROM study_groups JOIN specializations
-                    ON study_groups.SpecializationID=specializations.ID 
+                    SELECT study_groups.ID FROM study_groups 
+                    JOIN specializations ON study_groups.SpecializationID=specializations.ID 
                     WHERE study_groups.GradeID=%gradeEqual AND specializations.ID=%specEqual
                 </selectEqual>
                 <key colName="ID" relatedTable="study_groups" foreignKey="ID">
                     <value colName="GroupNum"></value>
                 </key>
                 <whereEqual>
-                    StudyGroupID=%groupEqual
+                    (SELECT COUNT(*) FROM students_groups WHERE students_groups.GroupID=%groupEqual)
                 </whereEqual>
             </equal>	
 		
diff --git a/java/AdditionalDBAdm/src/main/webapp/WEB-INF/configs/mmcs_rating/tablesDescs.xml b/java/AdditionalDBAdm/src/main/webapp/WEB-INF/configs/mmcs_rating/tablesDescs.xml
index fa45bbf852def52b825ac55f6833650c55c36ada..83676a0e94b3c5548cad327ed78263441d1b6b0d 100644
--- a/java/AdditionalDBAdm/src/main/webapp/WEB-INF/configs/mmcs_rating/tablesDescs.xml
+++ b/java/AdditionalDBAdm/src/main/webapp/WEB-INF/configs/mmcs_rating/tablesDescs.xml
@@ -45,7 +45,7 @@
 		<column nameInDB='Name' viewName='Название' orderByNum='0'></column>
 		<column nameInDB='Abbr' viewName='Аббревиатура'></column>
 	</table>
-	<table nameInDB='departments' viewName="Кафедра">
+	<table nameInDB='departments' viewName="Кафедры">
 		<column nameInDB='ID' hide='true'></column>
 		<column nameInDB='FacultyID' viewName='Факультет'></column>
 		<column nameInDB='Name' viewName='Название' orderByNum='0'></column>
@@ -58,11 +58,11 @@
 		<column nameInDB='ExamType' viewName='ExamType'></column>
 		<column nameInDB='SemesterID' viewName='Семестр'></column>
 		<column nameInDB='PracticeCount' viewName='Практика (часов)'></column>
-		<column nameInDB='LectionCount' viewName='Лекции (часов)'></column>
+		<column nameInDB='LectureCount' viewName='Лекции (часов)'></column>
 		<column nameInDB='LabCount' viewName='Лабораторные (часов)'></column>
 		<column nameInDB='FacultyID' viewName='Факультет'></column>
 		<column nameInDB='isLocked' viewName='isLocked'></column>
-		<column nameInDB='isMilestone' viewName='isMilestone'></column>
+		<column nameInDB='Milestone' viewName='Milestone'></column>
 		<column nameInDB='MilestoneDate' viewName='MilestoneDate'></column>
 	</table>
 </tablesDesc>
\ No newline at end of file
diff --git a/java/AdditionalDBAdm/src/main/webapp/WEB-INF/web.xml b/java/AdditionalDBAdm/src/main/webapp/WEB-INF/web.xml
index 8dd804f943eb5c395d6a39a424995f3d57298d76..74e7b868a9ed153fd21b687491aa067701bc0b7e 100644
--- a/java/AdditionalDBAdm/src/main/webapp/WEB-INF/web.xml
+++ b/java/AdditionalDBAdm/src/main/webapp/WEB-INF/web.xml
@@ -69,8 +69,8 @@
     <servlet-name>MainServlet</servlet-name>
     <url-pattern>/noreg</url-pattern>
   </servlet-mapping>
-  <error-page1>
-	<error-code>400</error-code>
-	<location>/errorPage.jsp</location>
-  </error-page1>
+  <servlet-mapping>
+    <servlet-name>MainServlet</servlet-name>
+    <url-pattern>/default/logout</url-pattern>
+  </servlet-mapping>
 </web-app>
\ No newline at end of file
diff --git a/java/AdditionalDBAdm/src/main/webapp/WebPages/allRights.html b/java/AdditionalDBAdm/src/main/webapp/WebPages/allRights.html
new file mode 100644
index 0000000000000000000000000000000000000000..104122f6dedec26b669d71786729e01639a36f2c
--- /dev/null
+++ b/java/AdditionalDBAdm/src/main/webapp/WebPages/allRights.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!--
+To change this license header, choose License Headers in Project Properties.
+To change this template file, choose Tools | Templates
+and open the template in the editor.
+-->
+<html>
+    <head>
+        <title>Welcome page</title>
+        <meta charset="UTF-8">
+        <meta name="viewport" content="width=device-width, initial-scale=1.0">
+        <link rel='stylesheet' type='text/css' href='WebPages/css/panelStyle.css'>
+        <script src='WebPages/jquery-1.9.1.js' type='text/javascript'></script>
+	<script src='http://scriptjava.net/source/scriptjava/scriptjava.js' type='text/javascript'></script>
+        <script type="text/javascript">
+            $(document).ready(function()
+            {
+                $('#exitButton').on('click', function(event)
+                {
+                    location=urlServer+"/logout";
+                });
+            });
+        </script>
+    </head>
+    <body>
+        <div class='baseButton smallButton' id='exitButton'>Выход</div>
+        <div id="errorOut">
+                    
+        </div>
+    </body>
+</html>
diff --git a/java/AdditionalDBAdm/src/main/webapp/WebPages/css/panelStyle.css b/java/AdditionalDBAdm/src/main/webapp/WebPages/css/panelStyle.css
index 07892aa2033cd436574f38fd0ac75a00a3c28f91..42f6f582e099d03d89dcb920486d30c66719c1f0 100644
--- a/java/AdditionalDBAdm/src/main/webapp/WebPages/css/panelStyle.css
+++ b/java/AdditionalDBAdm/src/main/webapp/WebPages/css/panelStyle.css
@@ -1,9 +1,14 @@
 
 @import "http://webfonts.ru/import/aquarion.css";
 
+body, html
+{
+    height: auto;
+}
 body
 {
 	background-color: rgb(240,240,240);
+        overflow: auto;
 }
 
 *
@@ -83,6 +88,7 @@ body
 	/*width: 1024px;*/
 	width: 100%;
 	white-space: nowrap;
+        cursor: default;
 	/*overflow-x: auto;
     overflow-y: -moz-scrollbars-vertical;*/
 }
@@ -146,6 +152,12 @@ body
 	margin: 4px;
 	display: table-cell;
 	float: none;
+        
+        -ms-user-select: none;
+        -moz-user-select: none;
+        -khtml-user-select: none;
+        -webkit-user-select : none;
+        user-select: none;
 }
 
 .baseButton:hover 
diff --git a/java/AdditionalDBAdm/src/main/webapp/WebPages/mainPage.html b/java/AdditionalDBAdm/src/main/webapp/WebPages/mainPage.html
index 87469689c5006d44e4365ffbe40a78f83fa0d1bd..6b18e260192089daa6d3a4fb795d3909c26c6c19 100644
--- a/java/AdditionalDBAdm/src/main/webapp/WebPages/mainPage.html
+++ b/java/AdditionalDBAdm/src/main/webapp/WebPages/mainPage.html
@@ -20,6 +20,7 @@
 	<div id='allContainer'>
 		<div id='headerDiv'>
 		<div class='baseButton smallButton' id='selectConnectionParams'>Параметры подключения</div>
+                <div class='baseButton smallButton' id='exitButton'>Выход</div>
 			<div class='showMessage' id='mainMessage'>
 				Выберите таблицу для редактирования
 			</div>
diff --git a/java/AdditionalDBAdm/src/main/webapp/WebPages/selectTableScript.js b/java/AdditionalDBAdm/src/main/webapp/WebPages/selectTableScript.js
index 0d154aafe2cbb80df7aead9a18cf30fe6847195a..976076707ad62b7051d1ca3b66ffc54d2f907e70 100644
--- a/java/AdditionalDBAdm/src/main/webapp/WebPages/selectTableScript.js
+++ b/java/AdditionalDBAdm/src/main/webapp/WebPages/selectTableScript.js
@@ -23,6 +23,10 @@ $(document).ready(function()
 	$('#eTableDiv').on('change', '.filterCheck', CheckFilter);
 	$('#eTableDiv').on('change', 'select.filterEqual, input.filterEqual', ChangeFilterEqual);
 	$('#eTableDiv').on('click', '.actionButton', ExecuteAction);
+        $('#exitButton').on('click', function(event)
+        {
+            location=urlServer+"/logout";
+        });
 });
 
 function OpenSelectDBConnParams()
@@ -252,7 +256,7 @@ function LoadTableFromName(e)
 	$('#tablesMenu > .baseButton').removeAttr('selected');
 	$(this).attr('selected', true);
 	
-	$('#editTypeMenu').html('<div class="baseButton" id="newRowMButton">Добавить новую строку</div>'/*+
+	$('#editTypeMenu').html('<div class="baseButton" id="newRowMButton">Добавить новую запись</div>'/*+
 		'<div class="baseButton" id="editTableMButton">Редактировать таблицу</div>'*/);
 	
 	//$('#eventMessage').html('Выберите желаемое действие');
diff --git a/~dev_rating/application/bootstrap.php b/~dev_rating/application/bootstrap.php
index 2b56dbcb9076c8f6cefaafd0bd51786212e281b2..f4552773a8f75b434235f006c6c0038b474474f6 100644
--- a/~dev_rating/application/bootstrap.php
+++ b/~dev_rating/application/bootstrap.php
@@ -3,17 +3,14 @@
 // -- Environment setup --------------------------------------------------------
 
 // Load the core Kohana class
-require SYSPATH.'classes/Kohana/Core'.EXT;
-
-if (is_file(APPPATH.'classes/Kohana'.EXT))
-{
-	// Application extends the core
-	require APPPATH.'classes/Kohana'.EXT;
-}
-else
-{
-	// Load empty core extension
-	require SYSPATH.'classes/Kohana'.EXT;
+require SYSPATH . 'classes/Kohana/Core' . EXT;
+
+if (is_file(APPPATH . 'classes/Kohana' . EXT)) {
+    // Application extends the core
+    require APPPATH . 'classes/Kohana' . EXT;
+} else {
+    // Load empty core extension
+    require SYSPATH . 'classes/Kohana' . EXT;
 }
 
 /**
@@ -38,7 +35,7 @@ setlocale(LC_ALL, 'ru-RU.utf-8');
  * @link http://kohanaframework.org/guide/using.autoloading
  * @link http://www.php.net/manual/function.spl-autoload-register
  */
-spl_autoload_register(array('Kohana', 'auto_load'));
+spl_autoload_register(['Kohana', 'auto_load']);
 
 /**
  * Optionally, you can enable a compatibility auto-loader for use with
@@ -70,10 +67,9 @@ mb_substitute_character('none');
  */
 I18n::lang('ru-ru');
 Cookie::$salt = sha1('ПРОЩАЙСТОЛОВАЯ');
-if (isset($_SERVER['SERVER_PROTOCOL']))
-{
-	// Replace the default protocol.
-	HTTP::$protocol = $_SERVER['SERVER_PROTOCOL'];
+if (isset($_SERVER['SERVER_PROTOCOL'])) {
+    // Replace the default protocol.
+    HTTP::$protocol = $_SERVER['SERVER_PROTOCOL'];
 }
 
 /**
@@ -82,9 +78,8 @@ if (isset($_SERVER['SERVER_PROTOCOL']))
  * Note: If you supply an invalid environment name, a PHP warning will be thrown
  * saying "Couldn't find constant Kohana::<INVALID_ENV_NAME>"
  */
-if (isset($_SERVER['KOHANA_ENV']))
-{
-	Kohana::$environment = constant('Kohana::'.strtoupper($_SERVER['KOHANA_ENV']));
+if (isset($_SERVER['KOHANA_ENV'])) {
+    Kohana::$environment = constant('Kohana::' . strtoupper($_SERVER['KOHANA_ENV']));
 }
 
 //Kohana::$environment = ($_SERVER['SERVER_NAME'] !== 'localhost') ? Kohana::PRODUCTION : Kohana::DEVELOPMENT;
@@ -104,17 +99,16 @@ if (isset($_SERVER['KOHANA_ENV']))
  * - boolean  caching     enable or disable internal caching                 FALSE
  * - boolean  expose      set the X-Powered-By header                        FALSE
  */
-Kohana::init(array(
-	'base_url'   => '/~dev_rating/',
-    'index_file' => FALSE
-));
-
+Kohana::init([
+    'base_url'   => '/~dev_rating/',
+    'index_file' => false
+]);
 
 
 /**
  * Attach the file write to logging. Multiple writers are supported.
  */
-Kohana::$log->attach(new Log_File(APPPATH.'logs'));
+Kohana::$log->attach(new Log_File(APPPATH . 'logs'));
 
 /**
  * Attach a file reader to config. Multiple readers are supported.
@@ -130,250 +124,159 @@ define('ASSEMBLY_VERSION', '0.9');
 /**
  * Enable modules. Modules are referenced by a relative or absolute path.
  */
-Kohana::modules(array(
-         'account'     => MODPATH.'account', // Authentication and account manager
-         'kotwig'     => MODPATH.'kotwig', // Twig template engine
-         'mpdf'     => MODPATH.'mpdf', // HTML->PDF converter
-         'phpexcel' => MODPATH.'phpexcel', // HTML->MS Excel 2007 converter
-         'mailer' => MODPATH.'mail',
-		// 'codebench'  => MODPATH.'codebench',  // Benchmarking tool
-	 	'database'   => MODPATH.'database',   // Database access
-	));
+Kohana::modules([
+    'kotwig'   => MODPATH . 'kotwig', // Twig template engine
+    'mpdf'     => MODPATH . 'mpdf', // HTML->PDF converter
+    'phpexcel' => MODPATH . 'phpexcel', // HTML->MS Excel 2007 converter
+    'mailer'   => MODPATH . 'mail',
+    // 'codebench'  => MODPATH.'codebench',  // Benchmarking tool
+    'database' => MODPATH . 'database',   // Database access
+]);
 
 /**
  * Set the routes. Each route must have a minimum of a name, a URI and a set of
  * defaults for the URI.
  */
 
-/* --------------- Авторизация ---------------- */
+// dedicated routes
+require APPPATH . 'routes/api.php';
+require APPPATH . 'routes/dean_office.php';
 
-Route::set('sign', '(sign(/<type>))', array('type' => '(up|in)'))
-    ->defaults(array(
-        'controller' => 'authentication',
-        'action'     => 'enter_frontdoor',
-    ));
-
-Route::set('secret_entrance', '(ssign(/<type>))', array('type' => '(up|in)'))
-    ->defaults(array(
-        'controller' => 'authentication',
-        'action'     => 'enter_backdoor',
-    ));
 
+Route::set('main', '')->defaults(['controller' => 'index']);
 
-Route::set('remind', 'remind')
-	->defaults(array(
-		'controller' => 'authentication',
-		'action'     => 'remind',
-	));
+// --------------- Authorization ----------------
+Route::set('sign', 'sign(/<type>)', ['type' => '(up|in)'])
+    ->defaults([
+        'controller' => 'Authentication',
+        'action'     => 'sign',
+    ]);
 
-Route::set('remind:end', 'remind/<token>')
-	->defaults(array(
-		'controller' => 'authentication',
-		'action'     => 'endremind',
-	));
+Route::set('sign:secret_entrance', 'ssign(/<type>)', ['type' => '(up|in)'])
+    ->defaults([
+        'controller' => 'Authentication',
+        'action'     => 'sign_anyway',
+    ]);
 
 Route::set('sign:out', 'sign/out')
-	->defaults(array(
-		'controller' => 'authentication',
-		'action'     => 'logout',
-	));
-
-/* --------------- Служебные ссылки ---------------- */
-Route::set('handler', 'handler/<controller>/<action>(/<id>)')
-	->defaults(array(
-		'action'    => 'index',
-        'directory' => 'handler'
-        ));
+    ->defaults([
+        'controller' => 'Authentication',
+        'action'     => 'logout',
+    ]);
+
+Route::set('sign:remind', 'remind')
+    ->defaults([
+        'controller' => 'Authentication',
+        'action'     => 'remind',
+    ]);
+
+Route::set('sign:restore', 'remind/<token>')
+    ->defaults([
+        'controller' => 'Authentication',
+        'action'     => 'restore',
+    ]);
+
+// --------------- Ajax features ----------------
+Route::set('handler', 'handler/<controller>(/<action>(/<id>))')
+    ->defaults([
+        'directory' => 'Handler',
+        'action'    => 'index',
+    ]);
 
 Route::set('window', 'window/<id>')
-	->defaults(array(
+    ->defaults([
         'controller' => 'Window',
-		'action'    => 'get'
-        ));
-                
-/* --------------- Общие ссылки ---------------- */
+        'action'     => 'get'
+    ]);
 
+// --------------- Common links ----------------
 Route::set('common:index', 'index')
-        ->defaults(array(
-            'controller' => 'UserEnvi',
-            'action' => 'index'
-        ));
-
-Route::set('common:settings', 'settings')
-        ->defaults(array(
-            'controller' => 'UserEnvi',
-            'action' => 'settings'
-        ));
-		
-Route::set('common:profile', 'profile(/<type>(/<id>))', array('type' => '(teacher|student)'))
-        ->defaults(array(
-            'controller' => 'UserEnvi',
-            'action' => 'profile'
-        ));
-
-/* --------------- Студенты ---------------- */
-
-Route::set('student:subject', 'subject/<id>', array('id' => '[0-9]+'))
-        ->defaults(array(
-            'directory' => 'student',
-            'controller' => 'subject',
-            'action' => 'show'
-        ));
-
-        // Внутренние вызовы!
-Route::set('student:index', 'student/index')
-        ->filter(function($route, $params, Request $request){
-            if($request->is_initial())
-                return FALSE;
-        })
-        ->defaults(array(
-            'directory' => 'student',
-            'controller' => 'index',
-            'action' => 'index'
-        ));
-
-Route::set('student:settings', 'student/settings')
-        ->filter(function($route, $params, Request $request){
-            if($request->is_initial())
-                return FALSE;
-        })
-        ->defaults(array(
-            'directory' => 'student',
-            'controller' => 'index',
-            'action' => 'settings'
-        ));
-		
-Route::set('student:profile', 'student/profile')
-        ->filter(function($route, $params, Request $request){
-            if($request->is_initial())
-                return FALSE;
-        })
-        ->defaults(array(
-            'directory' => 'student',
-            'controller' => 'profile',
-            'action' => 'show'
-        ));
-        
-/* --------------- Преподаватели ---------------- */
-
-Route::set('teacher:map:create', 'teacher/create/<type>', ['type' => '(discipline|coursework)'])
-    ->filter(function(Route $route, $params, Request $request){
+    ->defaults([
+        'controller' => 'Index',
+        'action'     => 'index'
+    ]);
+
+//Route::set('common:profile', 'profile(/<type>(/<id>))', ['type' => '(teacher|student)'])
+//    ->defaults([
+//        'controller' => 'UserEnvi',
+//        'action'     => 'profile'
+//    ]);
+
+// --------------- Students ----------------
+
+Route::set('student:index', 'student(/index)')
+    ->defaults([
+        'directory'  => 'Student',
+        'controller' => 'Index',
+        'action'     => 'index'
+    ]);
+
+# discipline view
+Route::set('student:subject', 'subject/<id>', ['id' => '[0-9]+'])
+    ->defaults([
+        'directory'  => 'Student',
+        'controller' => 'Subject',
+        'action'     => 'show'
+    ]);
+
+// --------------- Teachers ----------------
+
+# profile page
+Route::set('teacher:index', 'teacher(/index)')
+    ->defaults([
+        'directory'  => 'Teacher',
+        'controller' => 'Index',
+        'action'     => 'index'
+    ]);
+
+Route::set('teacher:profile', 'profile(/)')
+    ->defaults([
+        'directory'  => 'Teacher',
+        'controller' => 'Profile',
+        'action'     => 'index',
+    ]);
+
+# create & edit discipline
+Route::set('discipline:create', '<type>/create', ['type' => '(discipline|coursework)'])
+    ->filter(function (Route $route, $params, Request $request) {
         $params['action'] = 'create_' . $params['type'];
         return $params;
     })
+    ->defaults([
+        'directory'  => 'Teacher/Discipline',
+        'controller' => 'Create',
+    ]);
+
+Route::set('discipline:edit', 'discipline/<id>((/)<section>)', ['id' => '\d+'])
+    ->filter(function (Route $route, $params, Request $request) {
+        $params['action'] = 'edit_' . $params['section'];
+        return $params;
+    })
+    ->defaults([
+        'directory'  => 'Teacher/Discipline',
+        'controller' => 'Edit',
+        'section'    => 'structure',
+    ]);
+
+# discipline rate table
+Route::set('teacher:rating', '<type>/<id>', ['type' => '(rate|exam)', 'id' => '[0-9]+'])
     ->defaults(array(
         'directory' => 'teacher',
-        'controller' => 'discipline',
-        'action' => 'create_discipline'
+        'controller' => 'rating',
+        'action' => 'rate'
     ));
 
-Route::set('teacher:map:discipline', 'discipline/settings/<id>', array('id' => '[0-9]+'))
-        ->defaults(array(
-            'directory' => 'teacher',
-            'controller' => 'discipline',
-			'action' => 'EditSettings'
-        ));
-
-Route::set('teacher:map:structure', 'discipline/structure/<id>', array('id' => '[0-9]+'))
-        ->defaults(array(
-            'directory' => 'teacher',
-            'controller' => 'Discipline',
-			'action' => 'EditStructure'
-        ));
-
-Route::set('teacher:map:groups', 'discipline/groups/<id>', array('id' => '[0-9]+'))
-        ->defaults(array(
-            'directory' => 'teacher',
-            'controller' => 'Discipline',
-			'action' => 'EditGroups'
-        ));
-
-Route::set('teacher:map:students', 'discipline/students/<id>', array('id' => '[0-9]+'))
-        ->defaults(array(
-            'directory' => 'teacher',
-            'controller' => 'discipline',
-			'action' => 'EditStudents'
-        ));
-
-Route::set('teacher:map:teachers', 'discipline/teachers/<id>', array('id' => '[0-9]+'))
-        ->defaults(array(
-            'directory' => 'teacher',
-            'controller' => 'discipline',
-			'action' => 'EditTeachers'
-        ));
-
-Route::set('teacher:rating', 'rate/<id>', array('id' => '[0-9]+'))
-        ->defaults(array(
-            'directory' => 'teacher',
-            'controller' => 'rating',
-            'action' => 'edit'
-        ));
-Route::set('teacher:exam', 'exam/<id>', array('id' => '[0-9]+'))
-        ->defaults(array(
-            'directory' => 'teacher',
-            'controller' => 'rating',
-            'action' => 'exam'
-        ));
-
-        // Внутренние вызовы!
-Route::set('teacher:index', 'teacher/index')
-        ->filter(function($route, $params, Request $request){
-            if($request->is_initial())
-                return FALSE;
-        })
-        ->defaults(array(
-            'directory' => 'teacher',
-            'controller' => 'index',
-            'action' => 'index'
-        ));
-
-Route::set('teacher:settings', 'teacher/settings')
-        ->filter(function($route, $params, Request $request){
-            if($request->is_initial())
-                return FALSE;
-        })
-        ->defaults(array(
-            'directory' => 'teacher',
-            'controller' => 'index',
-            'action' => 'settings'
-        ));
-
-Route::set('teacher:profile', 'teacher/profile(/<action>(/<id>))', array('action' => '(student)', 'id' => '[0-9]+'))
-        ->filter(function($route, $params, Request $request){
-            if($request->is_initial())
-                return FALSE;
-        })
-        ->defaults(array(
-            'directory' => 'teacher',
-            'controller' => 'profile',
-            'action' => 'edit'
-        ));
-
-/* --------------- Администрирование ---------------- */
+// --------------- Администрирование ----------------
 Route::set('admin:common', 'admin(/<controller>(/<action>(/<param1>(:<param2>))))')
-        ->defaults(array(
-            'directory' => 'admin',
-            'controller' => 'index',
-            'action' => 'index'
-        ));
-
-/* --------------- Деканат  ---------------- */
-Route::set('dean_office:index', 'dean_office(/<controller>(/<action>(/<param1>(:<param2>))))')
-        ->defaults(array(
-            'directory' => 'DeanOffice',
-            'controller' => 'sheets',
-            'action' => 'index'
-        ));
-
-# http://grade.mmcs.sfedu.ru/students/list
-Route::set('dean_office:academic_leaves', 'students/list')
     ->defaults([
-        'directory' => 'DeanOffice',
-        'controller' => 'Students',
-        'action' => 'list'
+        'directory'  => 'Admin',
+        'controller' => 'Index',
+        'action'     => 'index'
     ]);
-/* --------------- Java session provider -------------- */
+
+// --------------- Java session provider --------------
 Route::set('javaSessionProvider', 'java_authentication')
-	->defaults(array(
-		'controller' => 'JavaAuthentication',
-		'action' => 'authentication',));
+    ->defaults([
+        'controller' => 'JavaAuthentication',
+        'action'     => 'authentication'
+    ]);
diff --git a/~dev_rating/application/classes/Account.php b/~dev_rating/application/classes/Account.php
new file mode 100644
index 0000000000000000000000000000000000000000..d99d9aac3ce56259e68b19b27f279c111ae51a38
--- /dev/null
+++ b/~dev_rating/application/classes/Account.php
@@ -0,0 +1,122 @@
+<?php
+
+require(DOCROOT.'/modules/mail/vendor/PHPMailer/PHPMailerAutoload.php');
+
+function gradeSendMail($subject, $body, $sendToEmail, $sendToName) {
+    $mail = new PHPMailer;
+
+    //$mail->SMTPDebug = 3;                               // Enable verbose debug output
+
+    $mail->isSMTP();                                      // Set mailer to use SMTP
+    $mail->Host = 'class.mmcs.sfedu.ru';  // Specify main and backup SMTP servers
+    $mail->SMTPAuth = false;                               // Enable SMTP authentication
+    $mail->Username = NULL;                 // SMTP username
+    $mail->Password = NULL;                           // SMTP password
+    $mail->SMTPSecure = NULL;                            // Enable TLS encryption, `ssl` also accepted
+    $mail->Port = 25;                                    // TCP port to connect to
+
+    $mail->From = 'no_reply@grade.sfedu.ru';
+    $mail->FromName = 'Grade System (Сервис БРС)';
+    $mail->addAddress($sendToEmail, $sendToName);     // Add a recipient
+    //$mail->addAddress('ellen@example.com');               // Name is optional
+    //$mail->addReplyTo('info@example.com', 'Information');
+    //$mail->addCC('cc@example.com');
+    //$mail->addBCC('bcc@example.com');
+
+    //$mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
+    //$mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name
+    //$mail->isHTML(true);                                  // Set email format to HTML
+
+    $mail->Subject = $subject;
+    $mail->Body    = $body;
+    //$mail->ContentType = 'text/plain';
+    $mail->CharSet = 'utf-8';
+    //$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
+
+    if(!$mail->send()) {
+        Log::instance()->add(Log::NOTICE, 'Message could not be sent: '.$mail->ErrorInfo);
+        //echo 'Mailer Error: ' . $mail->ErrorInfo;
+    } else {
+        Log::instance()->add(Log::NOTICE, 'Message has been sent');
+    }
+}
+
+class Account
+{
+    private static function checkTokenLifetime($creationDate) {
+        $config = Kohana::$config->load('security.securityPolicy');
+        $lifetime = $config['recoveryToken']['lifetime'];
+        return (time() - $creationDate) > $lifetime;
+    }
+
+    public static function checkToken($token) {
+        $recovery = Model_Account::getRecoveryInfoByToken($token)[0];
+        $response = true;
+
+        if ($recovery['isUsed']) {
+            $response = false;
+        } else {
+            $date = strtotime($recovery['Date']);
+            if (self::checkTokenLifetime($date)) {
+                Model_Account::useRecoveryToken($recovery['Token']);
+                $response = false;
+            }
+        }
+        return $response;
+    }
+
+    public static function createRecoveryRequest($email) {
+        $requestToken = sha1($email.time().Cookie::$salt);
+
+        $UserFullName = Model_Account::createRecoveryToken($email, $requestToken);
+        if (!$UserFullName) {
+            throw HTTP_Exception::factory(403, 'Пользователь с таким e-mail адресом не зарегистрирован в системе!');
+        }
+
+        $subject = ASSEMBLY_SYSTEM_NAME . ": Восстановление пароля";
+
+        $twig = Twig::factory('email/recovery');
+        $twig->curl = 'https://grade.sfedu.ru/'; // URL::base('https', TRUE); TODO: fix after mmcs.sfedu.ru gets SSL-certificate
+        $twig->Token = $requestToken;
+        $twig->EMail = $email;
+        $twig->Subject = $subject;
+
+        /* Kohana mailer is not working
+        $status = Mailer::factory()
+            ->headers('Content-Type', 'text/html; charset=utf-8')
+            ->subject($subject)
+            ->in_reply_to(Mailer::message_id())
+            ->from('no-reply@rating.mmcs.sfedu.ru')
+            ->body($twig->render())
+            ->send($email);*/
+        gradeSendMail($subject, $twig->render(), $email, $UserFullName);
+    }
+
+    public static function changePasswordByToken($token, $password) {
+        $recovery = Model_Account::getRecoveryInfoByToken($token)[0];
+        self::changePassword($recovery['AccountID'], $password);
+        Model_Account::useRecoveryToken($token);
+    }
+
+    public static function doesLoginExist($login) {
+        $login_count = Model_Account::checkAccountExistence($login, 'login');
+        return $login_count > 0;
+    }
+
+    public static function isMailValid($email) {
+        $email_count = Model_Account::checkAccountExistence($email, 'email');
+        return $email_count > 0;
+    }
+
+
+//    // We don't change email address:\
+//    public static function changeEMail($id, $newEMail) {
+//        $response = Model_Account::changeMail($id, $newEMail);
+//        return $response != -1;
+//    }
+
+    public static function changePassword($id, $newPassword) {
+        $response = Model_Account::changeAccountData($id, $newPassword, 'password');
+        return $response != -1;
+    }
+}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Admin/Accounts.php b/~dev_rating/application/classes/Controller/Admin/Accounts.php
index 1c100dedde4aca6f74ab375bff63b1697f2cf043..2f2d809c27194b977dacb9225c087cd545e4d58b 100644
--- a/~dev_rating/application/classes/Controller/Admin/Accounts.php
+++ b/~dev_rating/application/classes/Controller/Admin/Accounts.php
@@ -1,24 +1,16 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Controller_Admin_Accounts extends Controller_UserEnvironment {
-
-    public function action_index()
-    {
-        $twig = Twig::factory('admin/accounts/index');
-        
-        $twig->User = $this->user;
-        $this->response->body($twig);
+class Controller_Admin_Accounts extends Controller_Environment_Admin
+{
+    public function action_index() {
+        $this->twig->set_filename('admin/accounts/index');
     }
-    
-    public function action_getActivationCodes()
-    {
-        $model = new Model_Students();
+
+    public function action_getActivationCodes() {
         Cookie::set('fD', 'true');
-        $twig = Twig::factory('admin/accounts/codes');
-        $twig->Faculties = Model_Faculties::toArray();
-        $twig->Grades = Model_Grades::toStructuredArray();
-        $twig->User = $this->user;
-        $this->response->body($twig);
+        $this->twig->set([
+            'Faculties' => Model_Faculties::load(),
+            'Grades'    => Model_Grades::toStructuredArray(),
+        ])->set_filename('admin/accounts/codes');
     }
 }
-            
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Admin/Departments.php b/~dev_rating/application/classes/Controller/Admin/Departments.php
index 20c6327862c278cca01cbc1da478a36616ad9ecf..fd5be6640ed218445053657491d9ae00e57ca03f 100644
--- a/~dev_rating/application/classes/Controller/Admin/Departments.php
+++ b/~dev_rating/application/classes/Controller/Admin/Departments.php
@@ -1,21 +1,12 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Controller_Admin_Departments extends Controller_UserEnvironment {
-
-    public function action_index()
-    {
-        $twig = Twig::factory('admin/departments/index');
-        
-        $twig->User = $this->user;
-        $this->response->body($twig);
+class Controller_Admin_Departments extends Controller_Environment_Admin
+{
+    public function action_index() {
+        $this->twig->set_filename('admin/departments/index');
     }
-    
-    public function action_upload()
-    {
-        $twig = Twig::factory('admin/departments/upload');
-        
-        $twig->User = $this->user;
-        $this->response->body($twig);
+
+    public function action_upload() {
+        $this->twig->set_filename('admin/departments/upload');
     }
 }
-            
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Admin/Disciplines.php b/~dev_rating/application/classes/Controller/Admin/Disciplines.php
index add35ba6122cafda1aceecbdfcc3beeeefad027c..3ee0db34b41d9fe08bd680d523402a176bca90fb 100644
--- a/~dev_rating/application/classes/Controller/Admin/Disciplines.php
+++ b/~dev_rating/application/classes/Controller/Admin/Disciplines.php
@@ -1,13 +1,8 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Controller_Admin_Disciplines extends Controller_UserEnvironment {
-
-    public function action_index()
-    {
-        $twig = Twig::factory('admin/disciplines/index');
-        
-        $twig->User = $this->user;
-        $this->response->body($twig);
+class Controller_Admin_Disciplines extends Controller_Environment_Admin
+{
+    public function action_index() {
+        $this->twig->set_filename('admin/disciplines/index');
     }
 }
-            
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Admin/Groups.php b/~dev_rating/application/classes/Controller/Admin/Groups.php
index b18e6573ae0f512fb92276a7ce87c9e4114f6a70..661e61a356fe32445b66a37c3e8a9528947c24a1 100644
--- a/~dev_rating/application/classes/Controller/Admin/Groups.php
+++ b/~dev_rating/application/classes/Controller/Admin/Groups.php
@@ -1,13 +1,8 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Controller_Admin_Groups extends Controller_UserEnvironment {
-
-    public function action_index()
-    {
-        $twig = Twig::factory('admin/groups/index');
-        
-        $twig->User = $this->user;
-        $this->response->body($twig);
+class Controller_Admin_Groups extends Controller_Environment_Admin
+{
+    public function action_index() {
+        $this->twig->set_filename('admin/groups/index');
     }
 }
-            
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Admin/Index.php b/~dev_rating/application/classes/Controller/Admin/Index.php
index 7b2bd6b3bad027297cc172e66e937141a5e36fb3..1970545846b4b5515c93f6e9e84ca7adf54b2cdc 100644
--- a/~dev_rating/application/classes/Controller/Admin/Index.php
+++ b/~dev_rating/application/classes/Controller/Admin/Index.php
@@ -1,13 +1,8 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Controller_Admin_Index extends Controller_UserEnvironment {
-
-    public function action_index()
-    {
-        $twig = Twig::factory('admin/index');
-        
-        $twig->User = $this->user;
-        $this->response->body($twig);
+class Controller_Admin_Index extends Controller_Environment_Admin
+{
+    public function action_index() {
+        $this->twig->set_filename('admin/index');
     }
 }
-            
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Admin/Profile.php b/~dev_rating/application/classes/Controller/Admin/Profile.php
index 2a1c3f758214e6863cba7b6e422957f3de3fbae7..c0e7dfb21fb89b0acfa84dbb5579d3808750b148 100644
--- a/~dev_rating/application/classes/Controller/Admin/Profile.php
+++ b/~dev_rating/application/classes/Controller/Admin/Profile.php
@@ -1,29 +1,21 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Controller_Admin_Profile extends Controller_UserEnvironment {
-
-    public function action_student()
-    {
-        $twig = Twig::factory('admin/students/profile');
-        $id = $this->request->param('param1');
-        $model = new Model_Account;
-        $profile = $model->getPersonalInfo($id);
-        $profile['Degree'] = Model_Grades::getDegreeTitle($profile['Degree']);
-        $twig->Account = $model->getAccountInfo($id);
-        $twig->Profile = $profile;
-        $twig->User = $this->user;
-        $this->response->body($twig);
+class Controller_Admin_Profile extends Controller_Environment_Admin
+{
+    public function action_student() {
+        $id = (int) $this->request->param('param1');
+        $student = Model_Student::load($id);
+        $this->twig->set([
+            'Account' => Model_Account::getAccountInfo($student->ID),
+            'Profile' => $student,
+        ])->set_filename('admin/students/profile');
     }
-    
-    public function action_teacher()
-    {
-        $twig = Twig::factory('admin/teachers/profile');
-        $id = $this->request->param('param1');
-        $model = new Model_Account;
-        $twig->Account = $model->getAccountInfo($id);
-        $twig->Profile = $model->getPersonalInfo($id);
-        $twig->User = $this->user;
-        $this->response->body($twig);
+
+    public function action_teacher() {
+        $id = (int) $this->request->param('param1');
+        $this->twig->set([
+            'Account' => Model_Account::getAccountInfo($id),
+            'Profile' => Model_Account::getPersonalInfo($id),
+        ])->set_filename('admin/teachers/profile');
     }
 }
-            
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Admin/Students.php b/~dev_rating/application/classes/Controller/Admin/Students.php
index ecbd1cb3ed6ae8955914e3e94d346015a7708f9d..b7cfcb695c91bc646b5286ce4f00169b5d8aee66 100644
--- a/~dev_rating/application/classes/Controller/Admin/Students.php
+++ b/~dev_rating/application/classes/Controller/Admin/Students.php
@@ -1,50 +1,37 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Controller_Admin_Students extends Controller_UserEnvironment {
-
-    public function action_index()
-    {
-        // VIEW
-        $twig = Twig::factory('admin/students/index');
-        $twig->Faculties = Model_Faculties::toArray();
-        $twig->Grades = Model_Grades::toStructuredArray();
-        $twig->User = $this->user;
-        $this->response->body($twig);        
+class Controller_Admin_Students extends Controller_Environment_Admin
+{
+    public function action_index() {
+        $this->twig->set([
+            'Faculties' => Model_Faculties::load(),
+            'Grades'    => Model_Grades::toStructuredArray(),
+        ])->set_filename('admin/students/index');
     }
-    
-    public function action_add()
-    {
-        $twig = Twig::factory('admin/students/add');
-        $twig->Faculties = Model_Faculties::toArray();
-        $twig->Grades = Model_Grades::toStructuredArray();
-        $twig->User = $this->user;
-        $this->response->body($twig);
+
+    public function action_add() {
+        $this->twig->set([
+            'Faculties' => Model_Faculties::load(),
+            'Grades'    => Model_Grades::toStructuredArray(),
+        ])->set_filename('admin/students/add');
     }
-    
-    public function action_upload()
-    {
-        if(!empty($_FILES['students']) AND $this->request->method() == 'POST')
-        {
-            $result = $this->parseFile($_FILES["students"]["tmp_name"]);
+
+    public function action_upload() {
+        $errors = [];
+
+        if (!empty($_FILES['students']) && $this->request->method() == 'POST') {
+            $file = $_FILES['students']["tmp_name"];
+            $errors = FileParser::uploadStudents($file, $_POST['facultyID']);
         }
-        // VIEW
-        $twig = Twig::factory('admin/students/upload');
-        $twig->Faculties = Model_Faculties::toArray();
-        $twig->UploadingResult = $result;
-        $twig->User = $this->user;
-        $this->response->body($twig);
-    }
 
-    public function action_edit()
-    {
-        $twig = Twig::factory('admin/students/edit');    
-        $twig->User = $this->user;
-        $this->response->body($twig);
+        $this->twig->set([
+            'Errors'    => $errors,
+            'Faculties' => Model_Faculties::load(),
+        ])->set_filename('admin/students/upload');
     }
-    
-    protected function parseFile($filename)
-    {
-        return FileParser::StudentsList($filename, $_POST['facultyID']);
+
+    public function action_edit() {
+        $this->twig->set_filename('admin/students/edit');
     }
 }
             
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Admin/Subjects.php b/~dev_rating/application/classes/Controller/Admin/Subjects.php
index b14d43a2df4316944f35437c6a6c709a127aa106..3f83c07e85ee293d6e858aceba87710e8a7dc35c 100644
--- a/~dev_rating/application/classes/Controller/Admin/Subjects.php
+++ b/~dev_rating/application/classes/Controller/Admin/Subjects.php
@@ -1,30 +1,18 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Controller_Admin_Subjects extends Controller_UserEnvironment {
+class Controller_Admin_Subjects extends Controller_Environment_Admin
+{
+    public function action_upload() {
+        $result = [];
 
-
-    
-    public function action_upload()
-    {
-        $result['Success'] = false;
-        if(!empty($_FILES['subjects']) AND $this->request->method() == 'POST')
-        {
-            $result = $this->parseFile($_FILES["subjects"]["tmp_name"]);
+        if (!empty($_FILES['subjects']) && $this->request->method() == 'POST') {
+            $file = $_FILES["subjects"]["tmp_name"];
+            $result = FileParser::uploadSubjects($file, $_POST['facultyID']);
         }
-        // VIEW
-        $twig = Twig::factory('admin/subjects/upload');
-        $twig->Faculties = Model_Faculties::toArray();
-        $twig->UploadingResult = $result;
-        $twig->User = $this->user;
-        $this->response->body($twig);
-    }
 
-
-    protected function parseFile($filename)
-    {
-        return FileParser::SubjectsList($filename, $_POST['facultyID']);
+        $this->twig->set([
+            'UploadingResult' => $result,
+            'Faculties'       => Model_Faculties::load(),
+        ])->set_filename('admin/subjects/upload');
     }
-
-      
 }
-            
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Admin/Teachers.php b/~dev_rating/application/classes/Controller/Admin/Teachers.php
index cab950ed5e593126e092b3116bd905d56ef17a65..be647e34a2f12494fcb6a79e0c1865c388b8410f 100644
--- a/~dev_rating/application/classes/Controller/Admin/Teachers.php
+++ b/~dev_rating/application/classes/Controller/Admin/Teachers.php
@@ -1,57 +1,30 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Controller_Admin_Teachers extends Controller_UserEnvironment {
-
-    public function action_index()
-    {
-        // VIEW
-        $twig = Twig::factory('admin/teachers/index');
-        $twig->Faculties = Model_Faculties::toArray();
-        $twig->User = $this->user;
-        $this->response->body($twig);
-    }
-    
-    public function action_add()
-    {
-        $twig = Twig::factory('admin/teachers/add');
-        $twig->JobPositions = $this->getJobPositions();
-        $twig->Faculties = Model_Faculties::toArray();
-        $twig->User = $this->user;
-        $this->response->body($twig);
+class Controller_Admin_Teachers extends Controller_Environment_Admin
+{
+    public function action_index() {
+        $this->twig->set_filename('admin/teachers/index')
+            ->set('Faculties', Model_Faculties::load());
     }
-    
-    public function action_upload()
-    {
-        if(!empty($_FILES['teachers']) AND $this->request->method() == 'POST')
-        {
-            $result = $this->parseFile($_FILES["teachers"]["tmp_name"]);
-        }
-        // VIEW
-        $twig = Twig::factory('admin/teachers/upload');
-        $twig->Faculties = Model_Faculties::toArray();
-        $twig->UploadingResult = $result;
-        $twig->User = $this->user;
-        $this->response->body($twig);
-    }    
-    
-    protected function parseFile($filename)
-    {
-        return FileParser::TeachersList($filename);
+
+    public function action_add() {
+        $this->twig->set([
+            'JobPositions' => Model_Teachers::getJobPositions(),
+            'Faculties'    => Model_Faculties::load(),
+        ])->set_filename('admin/teachers/add');
     }
-    
-    // todo: move to teachers model, there's a duplicate at profile.php
-    public function getJobPositions()
-    {
-        $jobPositions = Model_Teachers::getJobPositions();
-        $jobPositionsHandled = array(); $i = 0;
-        foreach($jobPositions as $row)
-        {
-            $i++;
-            $jobPositionsHandled[$i]['ID'] = $row['ID'];
-            $jobPositionsHandled[$i]['Name'] = $row['Name'];
-            // $jobPositionsHandled[$i]['Abbr'] = $row['Abbr'];
+
+    public function action_upload() {
+        $errors = [];
+
+        if (!empty($_FILES['teachers']) && $this->request->method() == 'POST') {
+            $file = $_FILES["teachers"]["tmp_name"];
+            $errors = FileParser::uploadTeachers($file, $_POST['facultyID']);
         }
-        return $jobPositionsHandled;
+
+        $this->twig->set([
+            'Errors'          => $errors,
+            'Faculties'       => Model_Faculties::load(),
+        ])->set_filename('admin/teachers/upload');
     }
-            
 }           
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Authentication.php b/~dev_rating/application/classes/Controller/Authentication.php
index 94d3164e1e339c03d573c03927bb54325dd1abe0..a9dd895b966551ff69e875a5d55ddefbae20259b 100644
--- a/~dev_rating/application/classes/Controller/Authentication.php
+++ b/~dev_rating/application/classes/Controller/Authentication.php
@@ -1,123 +1,79 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Controller_Authentication extends Controller {
-        
-        public function before() {
-            parent::before();
-            if(UTF8::strcasecmp($this->request->action(), 'logout')) {
-                $user = User::instance();
-                if($user->isSignedIn()) {
-                    $request = $user->Type . '/index';
-                    $page = Request::factory($request)->execute();
-                    $this->response->body($page);
-                }
-            }
-        }
+class Controller_Authentication extends Controller
+{
+    /** @var  User */
+    private $user;
 
+    /** @var Twig */
+    private $twig;
 
-        protected function getUpdates() 
-        {
-            $fp = fopen(APPPATH.'updates.txt', 'r');
-            $updates['Date'] = fgets($fp, 999);
-            $text = '<ol>';
-            if ($fp) {
-                while (!feof($fp)) {
-                    $text .= '<li>'.fgets($fp, 999).'</li>';
-                }
-            }
-            $text .= '</ol>';
-            $updates['Text'] = $text;
-            return $updates;
-        }
 
-        private function sign()
-        {
-            if(!User::instance()->isSignedIn())
-            {
-                $type = $this->request->param('type');
-                if(empty($type)) $type = 'in';
-                $twig = Twig::factory('sign/'.$type);
-                
-                $twig->Updates = self::getUpdates();
-                $this->response->body($twig);
-            }
-        }
+    public function before() {
+        parent::before();
 
-        public function action_enter_backdoor()
-        {
-            $this->sign();
-        }
+        $this->user = User::instance();
+        $this->twig = Twig::factory();
+    }
 
-        public function action_enter_frontdoor()
-        {
-            $check = false;
-            $role = (int)User::instance()->offsetGet("RoleMark");
-            $isNotSigned = !User::instance()->isSignedIn();
-
-            if($isNotSigned || ($role & 8) == 0) // if not signed or not admin
-            {
-                $check = $this->check_maintenance();
-            }
-
-            if (!$check) {
-                $this->sign();
-            } else
-                User::instance()->signOut();
-        }
+    public function after() {
+        $this->twig->set([
+            'Markdown' => new Parsedown(),
+            'Updates'  => Model_System::getChangeLog(),
+        ]);
+        $this->response->body($this->twig);
 
-        public function action_remind()
-        {
-            if(!User::instance()->isSignedIn())
-            {
-                $twig = Twig::factory('sign/remindpass');
-                $twig->Updates = self::getUpdates();
-                $this->response->body($twig);
-            }
-        }
-        
-        public function action_endremind()
-        {
-            $token = $this->request->param('token');
-            if (!Account::instance()->checkToken($token)) {
-                $message = "Данная ссылка для восстановления пароля более не действительна!\n" .
-                    "Либо истекло время действия ссылки, либо она уже была использована.";
-                throw HTTP_Exception::factory(403, $message);
-            }
-
-            if (!User::instance()->isSignedIn()) {
-                $twig = Twig::factory('sign/changepass');
-                $twig->Updates = self::getUpdates();
-                $twig->Token = $token;
-                $this->response->body($twig);
-            }
-        }
-        
-        public function action_logout()
-        {
-            User::instance()->signOut();
-            $this->redirect('sign', 302);
-        }
+        parent::after();
+    }
 
-        private function check_maintenance()
-        {
-            $model = new Model_Account;
-            $maintenance_info = $model->getMaintenanceInfo();
-            if ($maintenance_info['active']) {
-                $this->response->status(503);
-                $twig = Twig::factory('errors/http');
-                $twig->title = 'Закрыто на техобслуживание!';
-                $twig->code = 503;
-                $twig->message = "Восстановление работы сервиса: " . $maintenance_info['return'];
-                $this->response->body($twig);
-                return true;
-            }
-            else
-                return false;
+
+    // for holy RS & dev group
+    public function action_sign_anyway() {
+        if ($this->user->isSignedIn())
+            $this->redirect('/');
+        $type = $this->request->param('type', $default = 'in');
+        $this->twig->set_filename('sign/' . $type);
+    }
+
+    // for mere mortals
+    public function action_sign() {
+        $info = Model_Account::getMaintenanceInfo();
+
+        if ($info['active']) {
+            $this->response->status(503);
+            $this->twig->set([
+                'code'    => 503,
+                'title'   => 'Закрыто на техобслуживание!',
+                'message' => "Восстановление работы сервиса: " . $info['return'],
+            ])->set_filename('errors/http');
+            return;
         }
 
-        public function action_check_maintenance()
-        {
-            $this->check_maintenance();
+        $this->action_sign_anyway();
+    }
+
+    public function action_logout() {
+        $this->user->signOut();
+        $this->redirect('sign', 302);
+    }
+
+    public function action_remind() {
+        $this->twig->set_filename('sign/remindpass');
+    }
+
+    public function action_restore() {
+        $token = $this->request->param('token');
+
+        if (!Account::checkToken($token)) {
+            $message = "Данная ссылка для восстановления пароля более не действительна!\n" .
+                "Либо истекло время действия ссылки, либо она уже была использована.";
+            throw HTTP_Exception::factory(403, $message);
         }
 
-} // End Welcome
+        $this->twig->set('Token', $token)->set_filename('sign/changepass');
+    }
+
+//    public function action_check_maintenance() {
+//        $this->check_maintenance();
+//    }
+}
diff --git a/~dev_rating/application/classes/Controller/DeanOffice/Credits.php b/~dev_rating/application/classes/Controller/DeanOffice/Credits.php
index c74acce3ec5e44b99552f8f891883611f567b7cd..d121682d239e6239095accd5d1c7dfe38ed8bf6c 100644
--- a/~dev_rating/application/classes/Controller/DeanOffice/Credits.php
+++ b/~dev_rating/application/classes/Controller/DeanOffice/Credits.php
@@ -1,58 +1,29 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Controller_DeanOffice_Credits extends Controller_UserEnvironment
+class Controller_DeanOffice_Credits extends Controller_Environment_DeanOffice
 {
-    public function before()
-    {
-        Cookie::set('fD', 'true'); // Ставим кук fD, чтоб иметь возможность скачать файл
+    public function before() {
         parent::before();
-    }
-
-    public function action_index()
-    {
-        $twig = Twig::factory('dean_office/credits');
-
-        $Disciplines = Model_Disciplines::ofFaculty($this->user['FacultyID']);
-        $list = array();
-        foreach($Disciplines as $Row)
-            if($Row['ExamType'] == "credit")
-                $list[] = $Row;
-        $twig->DisciplinesList = $list;
-        $Milestone = Model_Discipline::getMilestone($this->user['FacultyID'], $this->user['SemesterID'])->offsetGet(0);
-        $twig->CurrentMilestone = $Milestone['Num'];
-        $twig->User = $this->user;
-        $this->response->body($twig);
-    }
 
-    public function action_getMilestone()
-    {
-        $Milestone = Model_Discipline::getMilestone($this->user['FacultyID'], $this->user['SemesterID'])->offsetGet(0);
-        $this->response->body($Milestone['Num']);
+        // make it possible to download files
+        Cookie::set('fD', 'true');
     }
 
-    public function action_getInfo()
-    {
-        $id = (int) $_POST['ID'];
-        $info = Model_Discipline::getInfo($id);
-        $info['Teachers'] = Model_Teachers::forDiscipline($id, true, true);
-        $this->response->body(json_encode($info));
-    }
-
-    public function action_setCreditMilestone()
-    {
-        $id = (int)$this->request->param("param1");
-        $stage = (int)$this->request->param("param2");
+    public function action_index() {
+        $disciplines = Model_Faculty::with($this->user->FacultyID)->getDisciplines();
 
-        if ($stage >= 0 && $stage <= 3)
-            $o = Model_Discipline::setMilestone(0, $id, $stage)->offsetGet(0);
-        $this->response->body('');
-    }
-
-    public function action_setMilestone()
-    {
-        $stage = (int)$this->request->param("param1");
-        if ($stage >= 0 && $stage <= 3)
-            Model_Discipline::setMilestoneForCredits(0, $this->user['FacultyID'], $stage);
-        $this->response->body('');
+        $list = array();
+        foreach ($disciplines as $dis) {
+            if ($dis->Type == "credit")
+                $list[] = $dis;
+        }
+
+        // todo: check, does ->execute()[0] && ->execute()['Num'] have same behaviour
+        $milestone = Model_Discipline::getMilestone($this->user->FacultyID, $this->user->SemesterID)[0];
+
+        $this->twig->set([
+            'DisciplinesList'  => $list,
+            'CurrentMilestone' => $milestone,
+        ])->set_filename(static::DEAN . 'credits');
     }
 }
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/DeanOffice/Sheets.php b/~dev_rating/application/classes/Controller/DeanOffice/Sheets.php
index 95e2b6f009e9e1ce314e267d5acaac1be3b83085..418fd593931ff0786dba150100949861542fe88f 100644
--- a/~dev_rating/application/classes/Controller/DeanOffice/Sheets.php
+++ b/~dev_rating/application/classes/Controller/DeanOffice/Sheets.php
@@ -1,21 +1,16 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Controller_DeanOffice_Sheets extends Controller_UserEnvironment {
-
+class Controller_DeanOffice_Sheets extends Controller_Environment_DeanOffice
+{
     public function before() {
-        Cookie::set('fD', 'true'); // Ставим кук fD, чтоб иметь возможность скачать файл
-
         parent::before();
-    }
 
-    public function action_index()
-    {
-        $twig = Twig::factory('dean_office/sheets');
-        $model = new Model_Map;
-
-        $twig->GradesList = Model_Grades::toArray();
+        // make it possible to download files
+        Cookie::set('fD', 'true');
+    }
 
-        $twig->User = $this->user;
-        $this->response->body($twig);
+    public function action_index() {
+        $this->twig->set_filename(static::DEAN . 'sheets')
+            ->set('GradesList', Model_Grades::toArray());
     }
 }
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/DeanOffice/Students.php b/~dev_rating/application/classes/Controller/DeanOffice/Students.php
index f49edd24ece3564097cba80e1eea7457de0c8703..6321ab847de71627ed6d99693870a237637f3d50 100644
--- a/~dev_rating/application/classes/Controller/DeanOffice/Students.php
+++ b/~dev_rating/application/classes/Controller/DeanOffice/Students.php
@@ -1,12 +1,21 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Controller_DeanOffice_Students extends Controller_UserEnvironment
+class Controller_DeanOffice_Students extends Controller_Environment_DeanOffice
 {
+    # list / search through all students
     public function action_index() {
-        $twig = Twig::factory('dean_office/students/index');
-        $twig->Faculties = Model_Faculties::toArray();
-        $twig->Grades = Model_Grades::toStructuredArray();
-        $twig->User = $this->user;
-        $this->response->body($twig);
+        $this->twig->set([
+            'Faculties' => Model_Faculties::load(),
+            'Grades'    => Model_Grades::toStructuredArray(),
+        ])->set_filename(static::DEAN . '/students/index');
+    }
+
+    public function action_profile() {
+        $id = $this->request->param('id');
+        $student = Model_Student::load($id);
+        $this->twig->set([
+            'Profile' => $student,
+            'Account' => Model_Account::getAccountInfo($student->ID),
+        ])->set_filename(static::DEAN . 'students/profile');
     }
 }
diff --git a/~dev_rating/application/classes/Controller/Environment/Admin.php b/~dev_rating/application/classes/Controller/Environment/Admin.php
new file mode 100644
index 0000000000000000000000000000000000000000..627ae08c957d9a6e0269e65700e84562f8eac83e
--- /dev/null
+++ b/~dev_rating/application/classes/Controller/Environment/Admin.php
@@ -0,0 +1,13 @@
+<?php defined('SYSPATH') or die('No direct script access.');
+
+class Controller_Environment_Admin extends Controller_Environment_User
+{
+    /** @var User */
+    protected $user;
+
+    public function before() {
+        parent::before();
+
+        $this->user->checkAccess(User::RIGHTS_ADMIN);
+    }
+}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Environment/DeanOffice.php b/~dev_rating/application/classes/Controller/Environment/DeanOffice.php
new file mode 100644
index 0000000000000000000000000000000000000000..abb42a15efd76e87be4e2a70e3a12fcd177d2f1f
--- /dev/null
+++ b/~dev_rating/application/classes/Controller/Environment/DeanOffice.php
@@ -0,0 +1,16 @@
+<?php
+
+class Controller_Environment_DeanOffice extends Controller_Environment_User
+{
+    /**
+     * @var string
+     * Path to dean office twig folder
+     */
+    const DEAN = 'dean_office/';
+
+    public function before() {
+        parent::before();
+
+        $this->user->checkAccess(User::RIGHTS_DEAN);
+    }
+}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Environment/Student.php b/~dev_rating/application/classes/Controller/Environment/Student.php
new file mode 100644
index 0000000000000000000000000000000000000000..e432785263a089aef07de8d80ae9591c4223bd4b
--- /dev/null
+++ b/~dev_rating/application/classes/Controller/Environment/Student.php
@@ -0,0 +1,23 @@
+<?php defined('SYSPATH') or die('No direct script access.');
+
+class Controller_Environment_Student extends Controller_Environment_User
+{
+    /** @var Model_User_Student */
+    protected $user;
+
+    /**
+     * @var string
+     * Path to students twig folder
+     */
+    const STUDENT = 'student/';
+
+    public function before() {
+        parent::before();
+
+        $this->user->checkAccess(User::RIGHTS_STUDENT);
+
+        // todo: remove it, english only
+        $uniDegree = $this->user->Degree;
+        $this->user->Degree = Model_Grades::getDegreeTitle($uniDegree);
+    }
+}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Environment/Teacher.php b/~dev_rating/application/classes/Controller/Environment/Teacher.php
new file mode 100644
index 0000000000000000000000000000000000000000..afa937d268d06135b9657cbd64d57ac5f43b43e9
--- /dev/null
+++ b/~dev_rating/application/classes/Controller/Environment/Teacher.php
@@ -0,0 +1,13 @@
+<?php defined('SYSPATH') or die('No direct script access.');
+
+class Controller_Environment_Teacher extends Controller_Environment_User
+{
+    /** @var Model_User_Teacher */
+    protected $user;
+
+    public function before() {
+        parent::before();
+
+        $this->user->checkAccess(User::RIGHTS_TEACHER);
+    }
+}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Environment/User.php b/~dev_rating/application/classes/Controller/Environment/User.php
new file mode 100644
index 0000000000000000000000000000000000000000..0a3a25acdb1f7669cc974ef8086287813e3a198a
--- /dev/null
+++ b/~dev_rating/application/classes/Controller/Environment/User.php
@@ -0,0 +1,27 @@
+<?php defined('SYSPATH') or die('No direct script access.');
+
+abstract class Controller_Environment_User extends Controller
+{
+    /** @var  Twig */
+    protected $twig;
+
+    /** @var User */
+    protected $user;
+
+
+    public function before() {
+        // Check access to the page
+        $this->user = User::instance();
+        if (!$this->user->isSignedIn()) {
+            $this->redirect('sign', 302);
+            return;
+        }
+
+        $this->twig = Twig::factory();
+        $this->twig->bind_global('User', $this->user);
+    }
+
+    public function after() {
+        $this->response->body($this->twig);
+    }
+}
diff --git a/~dev_rating/application/classes/Controller/Handler.php b/~dev_rating/application/classes/Controller/Handler.php
index 53e69a60594f8e80d3e2509d26c90a94f6073676..f39efc26e2abf71f03eb410c5bd517bea8c991c0 100644
--- a/~dev_rating/application/classes/Controller/Handler.php
+++ b/~dev_rating/application/classes/Controller/Handler.php
@@ -1,8 +1,9 @@
 <?php defined('SYSPATH') or die('No direct script access.');
- 
-class Controller_Handler extends Controller {
+
+class Controller_Handler extends Controller
+{
     /** @var  Validation */
-    protected  $post;
+    protected $post;
 
     /** @var  Validation */
     protected $get;
@@ -10,79 +11,9 @@ class Controller_Handler extends Controller {
     /** @var  User */
     protected $user;
 
-    protected $model;
-
-    private $access;
-    
-    const ACCESS_USER = 0; 
-    const ACCESS_GUEST = 1; 
-    const ACCESS_ANYBODY = 2; 
-
-    public function before()
-    {
-        $isDownload = Cookie::get('fD');
+    public function before() {
         $this->user = User::instance();
-        // Если у нас запрос идет не из AJAX
-        if(!$this->request->is_ajax() && !$isDownload)
-        {
-            // Перенаправляем на ошибку доступа
-            throw HTTP_Exception::factory (403, "У Вас нет разрешения скачивать файлы!");
-        }
-        
-        // Обработка POST-данных
         $this->post = Validation::factory(Arr::map('trim', $_POST));
         $this->get = Validation::factory(Arr::map('trim', $_GET));
-        
-        // Если авторизован, получаем данные аккаунта
-        //if ($this->user->isSignedIn()) {
-        //    $this->user = $this->user->toArray();
-        //}
-        
-        // Получаем имя маршрута 
-        $route = Route::name($this->request->route());
-        $route .= ':'.$this->request->controller();
-        $userMark = (int)$this->user->RoleMark;
-        if ($userMark == 0) {
-            $userMark = (int)1;
-        }
-        // Если запрос не прошел на проверку доступа
-        if( !$this->checkAccessLevel() || 
-            !$this->checkBitmask($userMark, $route))
-        {
-            // Перенаправляем на ошибку доступа
-            throw HTTP_Exception::factory (403);
-        }
-    }
-    
-    protected function setAccessLevel($level)
-    {
-        $this->access = (int) $level;
-    }
-    
-    protected function checkBitmask($userMark, $route)
-    {
-        $sysModel = new Model_System;
-        $bitmask = (int)$sysModel->getBitmaskForRoute($route);
-        if(!$bitmask)
-            return true;
-        return ($bitmask & $userMark) != 0;
-    }    
-    
-    protected function checkAccessLevel()
-    {
-        switch($this->access)
-        {
-            case self::ACCESS_USER:
-                return User::instance()->isSignedIn();            
-            break;
-        
-            case self::ACCESS_GUEST:
-                return !User::instance()->isSignedIn();            
-            break;
-        
-            case self::ACCESS_ANYBODY:
-                return TRUE;
-            break;
-        }
     }
 }
diff --git a/~dev_rating/application/classes/Controller/Handler/AdmAccounts.php b/~dev_rating/application/classes/Controller/Handler/AdmAccounts.php
index 25f03a6d2482348a3000bf5209c4461cf5f141a9..c4e96a7a0d041884ad231183bb97fadcaf6f6506 100644
--- a/~dev_rating/application/classes/Controller/Handler/AdmAccounts.php
+++ b/~dev_rating/application/classes/Controller/Handler/AdmAccounts.php
@@ -3,9 +3,11 @@
 class Controller_Handler_AdmAccounts extends Controller_Handler
 {
         public function before() {
-            $this->setAccessLevel(self::ACCESS_USER);
             parent::before();
+
+            $this->user->checkAccess(User::RIGHTS_ADMIN);
         }
+
         
         public function action_getActivationForTeachers()
         {
@@ -21,7 +23,8 @@ class Controller_Handler_AdmAccounts extends Controller_Handler
                 $departmentsHandled[$i]['Name'] = $department['Name'];
                 foreach ($accounts as $row)
                 {
-                    $accInfo = Model_Accounts::getAccountInfo($row['AccountID']);
+                    # TODO: db query in loop
+                    $accInfo = Model_Account::getAccountInfo($row['AccountID']);
                     if($code = $accInfo->get('Code'))
                     {
                         $j++;
@@ -65,7 +68,7 @@ class Controller_Handler_AdmAccounts extends Controller_Handler
             $facultyID = $this->post['facultyID'];
             $gradeID = $this->post['gradeID'];
             $groupsHandled = array(); $i = 0;
-            $groups = Model_Students::getGroups($gradeID, $facultyID);
+            $groups = Model_Faculty::with($facultyID)->getGroups($gradeID);
             foreach ($groups as $group)
             {
                 $i++; $j = 0;
@@ -77,7 +80,8 @@ class Controller_Handler_AdmAccounts extends Controller_Handler
                 $groupsHandled[$i]['Spec'] = $group['SpecName'];
                 foreach ($accounts as $row)
                 {
-                    $accInfo = Model_Accounts::getAccountInfo($row['AccountID']);
+                    # TODO: db query in loop
+                    $accInfo = Model_Account::getAccountInfo($row['AccountID']);
                     if($code = $accInfo->get('Code'))
                     {
                         $j++;
diff --git a/~dev_rating/application/classes/Controller/Handler/AdmStudents.php b/~dev_rating/application/classes/Controller/Handler/AdmStudents.php
index d7ab8e06b6dbbfc7635ecf39e7e15b6fe47d695f..4008b9183d34779ee8030ae37dccfc0c09fa914b 100644
--- a/~dev_rating/application/classes/Controller/Handler/AdmStudents.php
+++ b/~dev_rating/application/classes/Controller/Handler/AdmStudents.php
@@ -1,171 +1,154 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-abstract class SortingOptions { //extends SplEnum {  // todo: think about usage & file system
+abstract class SortingOptions
+{ //extends SplEnum {  // todo: think about usage & file system
     //const __default = self::Name;
 
-    const Name = 0;
+    const Name  = 0;
     const Grade = 1;
     const Group = 2;
 }
 
 class Controller_Handler_AdmStudents extends Controller_Handler
 {
-        public function before() {
-            $this->setAccessLevel(self::ACCESS_USER);
-            parent::before();
+    const STUDENTS_LIST = '/handler/listStudents';
+
+    public function before() {
+        parent::before();
+
+        $this->user->checkAccess(User::RIGHTS_ADMIN);
+    }
+
+    public function action_createStudent() {
+        $response['success'] = false;
+        $this->post->rule('firstName', 'not_empty')
+            ->rule('lastName', 'not_empty')
+            ->rule('gradeNum', 'not_empty')
+            ->rule('gradeNum', 'digit')
+            ->rule('groupNum', 'not_empty')
+            ->rule('groupNum', 'digit')
+            ->rule('facultyID', 'not_empty')
+            ->rule('facultyID', 'digit');
+
+        if ($this->post['gradeNum'] == 0) {
+            $this->post->error('gradeNum', 'not_empty');
+            $response['success'] = false;
         }
 
-        public function action_createStudent()
-        {
+        if ($this->post['groupNum'] == 0) {
+            $this->post->error('groupNum', 'not_empty');
             $response['success'] = false;
-            $this->post
-                    ->rule('firstName', 'not_empty')
-                    // ->rule('firstName', 'alpha_dash', array(':value', TRUE))
-                    // ->rule('secondName', 'not_empty')
-                    // ->rule('secondName', 'alpha_dash', array(':value', TRUE))
-                    ->rule('lastName', 'not_empty')
-                    // ->rule('lastName', 'alpha_dash', array(':value', TRUE))
-                    ->rule('gradeNum', 'not_empty')
-                    ->rule('gradeNum', 'digit')
-                    ->rule('groupNum', 'not_empty')
-                    ->rule('groupNum', 'digit')
-                    ->rule('facultyID', 'not_empty')
-                    ->rule('facultyID', 'digit');
-            if($this->post['gradeNum'] == 0)
-            {
-                $this->post->error('gradeNum', 'not_empty');
-                $response['success'] = false;
-            }
-            if($this->post['groupNum'] == 0)
-            {
-                $this->post->error('groupNum', 'not_empty');
-                $response['success'] = false;
-            }
-            if($this->post['facultyID'] == 0)
-            {
-                $this->post->error('facultyID', 'not_empty');
+        }
+
+        if ($this->post['facultyID'] == 0) {
+            $this->post->error('facultyID', 'not_empty');
+            $response['success'] = false;
+        }
+
+        if ($this->post->check()) {
+            $code = Model_Account::createStudent(
+                    $this->post['lastName'], $this->post['firstName'], $this->post['secondName'],
+                    $this->post['gradeNum'], $this->post['groupNum'], $this->post['facultyID']
+                );
+
+            if ($code != -1) {
+                $response['success'] = true;
+                $response['code'] = $code;
+            } else {
                 $response['success'] = false;
             }
-            if($this->post->check())
-            {
-                $code = $this->_createStudent(
-                        $this->post['lastName'],
-                        $this->post['firstName'],
-                        $this->post['secondName'],
-                        $this->post['gradeNum'],
-                        $this->post['groupNum'],
-                        $this->post['facultyID']);
-                if($code != -1)
-                {
-                    $response['success'] = true;
-                    $response['code'] = $code;
+        } else {
+            $response['success'] = false;
+            $response['messages'] = $this->post->errors();
+        }
+        $this->response->body(json_encode($response));
+    }
+
+    public function action_getGroups() {
+        $facultyID = $this->post['facultyID'];
+        $gradeID = $this->post['gradeNum'];
+        if (($facultyID && $gradeID) != 0) {
+            $groups = Model_Faculty::with($facultyID)->getGroups($gradeID);
+            $groupsHandled = array();
+            $i = $j = $id = 0;
+            foreach ($groups as $row) {
+                if ($id != $row['SpecID']) {
+                    $i++;
+                    $j = 0;
+                    $id = $row['SpecID'];
                 }
-                else {
-                    $response['success'] = false;
+                $j++;
+                if (is_null($row['SpecName'])) {
+                    $groupsHandled[$i]['SpecName'] = "<без специализации>";
+                } else {
+                    $groupsHandled[$i]['SpecName'] = $row['SpecName'];
                 }
+                $groupsHandled[$i]['Groups'][$j]['ID'] = $row['ID'];
+                $groupsHandled[$i]['Groups'][$j]['Num'] = $row['GroupNum'];
             }
-            else
-            {
-                $response['success'] = false;
-                $response['messages'] = $this->post->errors();
-            }
-            $this->response->body(json_encode($response));
+            $this->response->body(json_encode($groupsHandled));
         }
-        
-        protected function _createStudent($lastName, $firstName, $secondName, $gradeID, $groupNum, $facultyID)
-        {
-            $activationCode = Account::instance()->createStudent($lastName, $firstName, $secondName, $gradeID, $groupNum, $facultyID);
-            return $activationCode;
-        }
-        
-        public function action_getGroups()
-        {
-            $facultyID = $this->post['facultyID'];
-            $gradeID = $this->post['gradeNum'];
-            if(($facultyID && $gradeID) != 0)
-            {
-                $groups = Model_Students::getGroups($gradeID, $facultyID);
-                $groupsHandled = array(); $i = $j = $id = 0;
-                foreach($groups as $row)
-                {
-                    if($id != $row['SpecID'])
-                    {
-                        $i++; $j = 0;
-                        $id = $row['SpecID'];
-                    }
-                    $j++;
-                    if (is_null($row['SpecName'])) 
-                    	$groupsHandled[$i]['SpecName'] = "<без специализации>";
-                    else
-                    	$groupsHandled[$i]['SpecName'] = $row['SpecName'];
-                    $groupsHandled[$i]['Groups'][$j]['ID'] = $row['ID'];
-                    $groupsHandled[$i]['Groups'][$j]['Num'] = $row['GroupNum'];
-                }
-                $this->response->body(json_encode($groupsHandled));
-            }
+    }
+
+    public function action_getStudentsList($option = SortingOptions::Name) {
+        $twig = Twig::factory(self::STUDENTS_LIST);
+
+        $facultyID = (int) $this->post['facultyID'];
+        $gradeID = (int) $this->post['gradeID'];
+        $groupID = (int) $this->post['groupID'];
+
+        if ($this->post->check()) {
+            $result = Model_Students::byFaculty($facultyID, $gradeID, $groupID);
+            $twig->List = $result;
         }
 
-        public function action_getStudentsList($option = SortingOptions::Name)
-        {
-            $from = isset($this->get['dean']) ? 'dean_office' : 'admin';
-            $twig = Twig::factory($from . '/students/handler/listOutput');
-
-            $success = false;
-            $facultyID = $this->post['facultyID'];
-            $gradeID = $this->post['gradeID'];
-            $groupID = $this->post['groupID'];
-
-            $this->post-> rule('facultyID', 'not_empty')
-                -> rule('facultyID', 'digit')
-                -> rule('gradeID', 'not_empty')
-                -> rule('gradeID', 'digit')
-                -> rule('groupID', 'not_empty')
-                -> rule('groupID', 'digit');
-
-            if($this->post->check()) {
-                $result = Model_Students::byFaculty($facultyID , $gradeID, $groupID);
-                if (!empty($result)) {
-                    $twig->List = $result;
-                    $success = true;
-                }
+        $this->response->body($twig);
+    }
 
-            }
-            //$this->response->body(json_encode($data));
-            $twig->Success = $success;
+    public function action_getStudentsByStudyGroup() {
+        $groupID = $this->post['studyGroupID'];
+
+        if ($groupID != 0) {
+            $twig = Twig::factory(self::STUDENTS_LIST);
+            $twig->List = Model_Students::byStudyGroup($groupID);
             $this->response->body($twig);
         }
+    }
 
-        public function action_getStudentsByStudyGroup()
-        {
-            $groupID = $this->post['studyGroupID'];
-            if($groupID != 0)
-            {
-                $twig = Twig::factory('admin/students/handler/listOutput');
-                $twig->List = Model_Students::byStudyGroup($groupID);
-                $this->response->body($twig);           
-            }
+    public function action_getStudentsByFaculty() {
+        $facultyID = $this->post['facultyID'];
+
+        if ($facultyID != 0) {
+            $twig = Twig::factory(self::STUDENTS_LIST);
+            // (Grade, Group) = (0,0), to ignore (search all students)
+            $twig->List = Model_Students::byFaculty($facultyID);
+            $this->response->body($twig);
         }
+    }
 
-        /** @deprecated */
-        public function action_getStudentsByFaculty()
-        {
-            $facultyID = $this->post['facultyID'];
-            if($facultyID != 0)
-            {
-                $twig = Twig::factory('admin/students/handler/listOutput');
-                // (Grade, Group) = (0,0), to ignore (search all students)
-                $twig->List = Model_Students::byFaculty($facultyID, 0, 0);
-                $this->response->body($twig);           
-            }
+    public function action_getStudentsByName() {
+        $twig = Twig::factory(self::STUDENTS_LIST);
+
+        $facultyID = (int) $this->post['facultyID'];
+        $gradeID = (int) $this->post['gradeID'];
+        $groupID = (int) $this->post['groupID'];
+        $name = $this->post['name'];
+
+        if (strlen($name) >= 3) {
+            $twig->List = Model_Students::searchStudentsByName($name, $facultyID, $gradeID, $groupID);
         }
 
+        $this->response->body($twig);
+    }
+
     public function action_giveLeave() {
+        // fixme
         $id = (int) $this->get['id'];
-        Model_Student::load($id)
-            ->toAcademicLeave();
+        Model_Student::load($id)->toAcademicLeave();
     }
 
     public function action_stopLeave() {
+        // fixme
         $id = (int) $this->get['id'];
         //Model_Student::load($id)
         //    ->attach()
diff --git a/~dev_rating/application/classes/Controller/Handler/AdmTeachers.php b/~dev_rating/application/classes/Controller/Handler/AdmTeachers.php
index 42663ffad3e054b1e1ef737bb31ddd2c76989c11..8519e3c5d4eace746f14e3da3a14b009b9b65a3a 100644
--- a/~dev_rating/application/classes/Controller/Handler/AdmTeachers.php
+++ b/~dev_rating/application/classes/Controller/Handler/AdmTeachers.php
@@ -1,11 +1,11 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
 class Controller_Handler_AdmTeachers extends Controller_Handler {
-        
+
         public function before() {
-            $this->model = new Model_Teachers();
-            $this->setAccessLevel(self::ACCESS_USER);
             parent::before();
+
+            $this->user->checkAccess(User::RIGHTS_ADMIN);
         }
         
         protected function action_createTeacher()
@@ -34,12 +34,13 @@ class Controller_Handler_AdmTeachers extends Controller_Handler {
             }
             if($this->post->check())
             {
-                $code = $this->_createTeacher(
+                $code = Model_Account::createTeacher(
                         $this->post['lastName'],
                         $this->post['firstName'],
                         $this->post['secondName'],
                         $this->post['jobPositionID'],
-                        $this->post['departmentID']);
+                        $this->post['departmentID']
+                    );
                 if($code != -1)
                 {
                     $response['success'] = true;
@@ -58,12 +59,6 @@ class Controller_Handler_AdmTeachers extends Controller_Handler {
             $this->response->body(json_encode($response));
         }
         
-        protected function _createTeacher($firstName, $secondName, $lastName, $degreeID, $departamentID)
-        {
-            $activationCode = Account::instance()->createTeacher($firstName, $secondName, $lastName, $degreeID, $departamentID);
-            return $activationCode;
-        }
-        
         public function action_getTeachersList()
         {
             $departmentID = $this->post['departmentID'];
diff --git a/~dev_rating/application/classes/Controller/Handler/Api.php b/~dev_rating/application/classes/Controller/Handler/Api.php
new file mode 100644
index 0000000000000000000000000000000000000000..bad32c0e8587b27b4fb5d20c10b38525eb322f86
--- /dev/null
+++ b/~dev_rating/application/classes/Controller/Handler/Api.php
@@ -0,0 +1,129 @@
+<?php defined('SYSPATH') OR die('No direct script access.');
+
+/**
+ * Class Controller_Handler_Api
+ * Not stable, use it only if you are Igor.
+ */
+abstract class Controller_Handler_Api extends Controller
+{
+    /** @var  array */
+    protected $get;
+
+    /** @var  array */
+    protected $post;
+
+    /** @var  User */
+    protected $user;
+
+    public function before() {
+        // todo: var $user should be defined here
+        //    either by GET param (token),
+        //    or on the session variables.
+
+        $this->user = User::instance();
+
+        $this->get =& $_GET;
+        $this->post =& $_POST;
+    }
+
+    public function execute() {
+        // Execute the "before action" method
+        $this->before();
+
+        // Determine the action to use
+        $action = 'action_' . $this->request->action();
+
+        // If the action doesn't exist, it's a 404
+        if (!method_exists($this, $action)) {
+            throw HTTP_Exception::factory(404,
+                'The requested URL :uri was not found on this server.',
+                [':uri' => $this->request->uri()]
+            )->request($this->request);
+        }
+
+        try {
+            // Execute the action itself
+            $data = $this->{$action}();
+            $answer = ['response' => ($data ? $data : '')];
+            $json_answer = json_encode($answer, JSON_UNESCAPED_UNICODE);
+        } catch (Exception $e) {
+            // todo: improve error capturing
+            while ($e->getPrevious())
+                $e = $e->getPrevious();
+
+            $answer = [
+                'error' => [
+                    'code'    => (int) $e->getCode(),
+                    'message' => (string) $e->getMessage(),
+//                  'request' => $this->request->params    // like http://vk.com/dev/captcha_error
+                ]
+            ];
+            $json_answer = json_encode($answer, JSON_UNESCAPED_UNICODE);
+        }
+
+        // Json API
+        if (!$this->request->is_ajax())
+            $json_answer = $this->indent($json_answer);
+        $this->response->body($json_answer);
+
+        // Execute the "after action" method
+        $this->after();
+
+        // Return the response
+        return $this->response;
+    }
+
+    /**
+     * Indents a flat JSON string to make it more human-readable.
+     * @param string $json The original JSON string to process.
+     * @return string Indented version of the original JSON string.
+     */
+    private function &indent(&$json) {
+        $result = '';
+        $pos = 0;
+        $strLen = strlen($json);
+        $indentStr = '  ';
+        $newLine = "\n";
+        $prevChar = '';
+        $outOfQuotes = true;
+
+        for ($i = 0; $i <= $strLen; $i++) {
+            // Grab the next character in the string.
+            $char = substr($json, $i, 1);
+
+            // Are we inside a quoted string?
+            if ($char == '"' && $prevChar != '\\') {
+                $outOfQuotes = !$outOfQuotes;
+
+                // If this character is the end of an element,
+                // output a new line and indent the next line.
+            } else if (($char == '}' || $char == ']') && $outOfQuotes) {
+                $result .= $newLine;
+                $pos--;
+                for ($j = 0; $j < $pos; $j++) {
+                    $result .= $indentStr;
+                }
+            }
+
+            // Add the character to the result string.
+            $result .= $char;
+
+            // If the last character was the beginning of an element,
+            // output a new line and indent the next line.
+            if (($char == ',' || $char == '{' || $char == '[') && $outOfQuotes) {
+                $result .= $newLine;
+                if ($char == '{' || $char == '[') {
+                    $pos++;
+                }
+
+                for ($j = 0; $j < $pos; $j++) {
+                    $result .= $indentStr;
+                }
+            }
+
+            $prevChar = $char;
+        }
+
+        return $result;
+    }
+}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Handler/ChangeLog.php b/~dev_rating/application/classes/Controller/Handler/ChangeLog.php
new file mode 100644
index 0000000000000000000000000000000000000000..db52762e8e8220edc84e3fbccdffc33cc0ea8372
--- /dev/null
+++ b/~dev_rating/application/classes/Controller/Handler/ChangeLog.php
@@ -0,0 +1,8 @@
+<?php defined('SYSPATH') or die('No direct script access.');
+
+class Controller_Api_ChangeLog extends Controller_Handler
+{
+    public function action_index() {
+        return Model_System::getChangeLog();
+    }
+}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Handler/CourseWork.php b/~dev_rating/application/classes/Controller/Handler/CourseWork.php
new file mode 100644
index 0000000000000000000000000000000000000000..06c11ad94d27153c93e63ba21434cb35bf5986cd
--- /dev/null
+++ b/~dev_rating/application/classes/Controller/Handler/CourseWork.php
@@ -0,0 +1,33 @@
+<?php defined('SYSPATH') or die('No direct script access.');
+
+class Controller_Handler_CourseWork extends Controller_Handler_Api
+{
+    /** @var  Model_User_Teacher */
+    protected $user;
+
+    public function action_create() {
+        $this->user->checkAccess(User::RIGHTS_TEACHER);
+
+        $coWork = Model_CourseWork::make()
+            ->author($this->user->TeacherID)
+            ->semester($this->user->SemesterID)
+            ->faculty($this->post['facultyID'])
+            ->grade($this->post['gradeID'])
+            ->subtype($this->post['subtype'])
+            ->subject($this->post['subjectID'])
+            ->create();
+
+        // Attach all teachers of the department to coursework
+        if ($coWork->Subtype == Model_CourseWork::SCIENTIFIC) {
+            $teachers = Model_Teachers::getTeachersByDepartment($this->user->DepID);
+            foreach ($teachers as $teacher)
+                $coWork->bind(Model_Teacher::with($teacher['ID']));
+        }
+
+        $module = Model_Map::addModule($this->user->TeacherID, $coWork->ID, 'Курсовая работа')[0]['Num'];
+        Model_Map::addSubmodule($this->user->TeacherID, $module, 100, 'Отчёт', '', 'LandmarkControl');
+
+        // Response to json client
+        return ['ID' => $coWork->ID];
+    }
+}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Handler/Coursework.php b/~dev_rating/application/classes/Controller/Handler/Coursework.php
deleted file mode 100644
index ce5e6b4330a915fa83eb3afdf13403a3cb06853c..0000000000000000000000000000000000000000
--- a/~dev_rating/application/classes/Controller/Handler/Coursework.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-
-class Controller_Handler_Coursework extends Controller_Handler_Map {
-
-    public function before() {
-        $this->setAccessLevel(self::ACCESS_USER);
-        parent::before();
-    }
-
-    public function action_add() {
-        $data['success'] = false;
-
-        $subject =& $this->post['subjectID'];
-        $subject = ($this->post['type'] == 'scientific') ? 346 : (int) $subject;
-
-        $this->post
-            ->rule('type', 'matches', [':validation', 'scientific', 'disciplinary'])
-            ->rule('grade', 'not_empty')
-            ->rule('grade', 'digit')
-            ->rule('facultyID', 'not_empty')
-            ->rule('facultyID', 'digit');
-
-        if ($subject > 0 && $this->post->check()) {
-            $discipline['id'] = Model_CourseWork::create([
-                'faculty' => $this->post['facultyID'],
-                'grade'   => $this->post['grade'],
-                'teacher' => $this->user['TeacherID'],
-                'type'    => $this->post['type'],
-                'subject' => $subject,
-            ]);
-
-            if ($discipline['id']) {
-                // Attach all teachers of the department to coursework
-                if ($this->post['type'] == 'scientific')
-                    foreach (Model_Teachers::getTeachersByDepartment($this->user->DepID) as $teacher)
-                        Model_Map::bindTeacher($this->user->TeacherID, $teacher['ID'], $discipline['id']);
-
-                $module = Model_Map::addModule($this->user['TeacherID'], $discipline['id'], 'Курсовая работа')[0]['Num'];
-                Model_Map::addSubmodule($this->user['TeacherID'], $module, 100, 'Отчёт', '', 'LandmarkControl');
-
-                // Response to json client
-                $data = [
-                    'success' => true,
-                    'id' => $discipline['id'],
-                ];
-            }
-        }
-
-        $this->response->body(json_encode($data));
-    }
-}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Handler/Credits.php b/~dev_rating/application/classes/Controller/Handler/Credits.php
new file mode 100644
index 0000000000000000000000000000000000000000..6b071c0ecc46867cd0667c03b97232b9697e0fe2
--- /dev/null
+++ b/~dev_rating/application/classes/Controller/Handler/Credits.php
@@ -0,0 +1,41 @@
+<?php defined('SYSPATH') or die('No direct script access.');
+
+class Controller_Handler_Credits extends Controller_Handler
+{
+    public function before() {
+        parent::before();
+
+        $this->user->checkAccess(User::RIGHTS_DEAN);
+
+        // make it possible to download files
+        Cookie::set('fD', 'true');
+    }
+
+    public function action_getMilestone() {
+        $Milestone = Model_Discipline::getMilestone($this->user->FacultyID, $this->user->SemesterID)[0];
+        $this->response->body($Milestone['Num']);
+    }
+
+    public function action_getInfo() {
+        $id = (int) $_POST['ID'];
+        $info = Model_Discipline::load($id);
+        $info['Teachers'] = Model_Teachers::getNamesForDiscipline($id, true, true);
+        $this->response->body(json_encode($info));
+    }
+
+    public function action_setCreditMilestone() {
+        $id = (int)$this->request->param("param1");
+        $stage = (int)$this->request->param("param2");
+
+        if ($stage >= 0 && $stage <= 3)
+            Model_Discipline::setMilestone(0, $id, $stage)[0];
+        $this->response->body('');
+    }
+
+    public function action_setMilestone() {
+        $stage = (int)$this->request->param("param1");
+        if ($stage >= 0 && $stage <= 3)
+            Model_Discipline::setMilestoneForCredits(0, $this->user->FacultyID, $stage);
+        $this->response->body('');
+    }
+}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Handler/Discipline.php b/~dev_rating/application/classes/Controller/Handler/Discipline.php
new file mode 100644
index 0000000000000000000000000000000000000000..fea300d5db751d72e39f79af37eada3294670cde
--- /dev/null
+++ b/~dev_rating/application/classes/Controller/Handler/Discipline.php
@@ -0,0 +1,112 @@
+<?php defined('SYSPATH') or die('No direct script access.');
+
+class Controller_Handler_Discipline extends Controller_Handler_Api
+{
+    /** @var  Model_User_Teacher */
+    protected $user;
+
+    # /handler/discipline/
+    public function action_index() {
+        $id = (int) $this->request->post('id');
+        return Model_Discipline::load($id);
+    }
+
+    # /handler/discipline/create
+    public function action_create() {
+        $this->user->checkAccess(User::RIGHTS_TEACHER);
+
+        $discipline = Model_Discipline::make()
+            ->author  ($this->user->TeacherID)
+            ->semester($this->user->SemesterID)
+            ->faculty ($this->post['facultyID'])
+            ->subject ($this->post['subjectID'])
+            ->grade   ($this->post['gradeID'])
+            ->lectures($this->post['lectures'])
+            ->practice($this->post['practice'])
+            ->labs    ($this->post['labs'])
+            ->type    ($this->post['type'])
+            ->create();
+
+        if ($this->post['bonus'] == "true")
+            Model_Map::AddModuleBonus($this->user->TeacherID, $discipline->ID);
+
+        return ['ID' => $discipline->ID];
+    }
+
+    # /handler/discipline/update
+    public function action_update() {
+        $this->user->checkAccess(User::RIGHTS_TEACHER);
+        
+        $id = (int) $this->request->post('id');
+
+        if ($id <= 0)
+            throw new InvalidArgumentException(Error::ID_IS_INCORRECT);
+
+        throw new LogicException('Not implemented yet');
+    }
+
+    # /handler/discipline/clear
+    public function action_clear() {
+        $this->user->checkAccess(User::RIGHTS_ADMIN);
+
+        $id = (int) $this->request->post('id');
+        Model_Discipline::load($id)->clear()->delete();
+    }
+
+    # /handler/discipline/delete
+    public function action_delete() {
+        $this->user->checkAccess(User::RIGHTS_TEACHER);
+        
+        $id = (int) $this->request->post('id');
+        $discipline = Model_Discipline::load($id);
+
+        // delete only if discipline cleared (doesn't exists related rating's records)
+        if ($discipline->AuthorID != $this->user->TeacherID)
+            throw new LogicException(Error::ACCESS_DENIED);
+        if ($discipline->IsLocked)
+            throw new LogicException(Error::DISCIPLINE_IS_LOCKED);
+        if (Model_Rating::count($discipline) > 0)
+            throw new LogicException(Error::DISCIPLINE_IS_LOCKED);
+
+        $discipline->delete();
+    }
+
+    public function action_delegate() {
+        $this->user->checkAccess(User::RIGHTS_TEACHER);
+        
+        $id = (int) $this->request->post('id');
+        $discipline = Model_Discipline::load($id);
+        if ($discipline->AuthorID != $this->user->TeacherID)
+            throw new LogicException(Error::ACCESS_DENIED);
+
+        $teacherID = (int) $this->request->post('teacherID');
+        $teacher = Model_Teacher::with($teacherID);
+        $discipline->delegateTo($teacher);
+    }
+
+    public function action_bind() {
+        $this->user->checkAccess(User::RIGHTS_TEACHER);
+        
+        $id = (int) $this->request->post('id');
+        $discipline = Model_Discipline::load($id);
+        if ($discipline->AuthorID != $this->user->TeacherID)
+            throw new LogicException(Error::ACCESS_DENIED);
+
+        $teacherID = (int) $this->request->post('teacherID');
+        $teacher = Model_Teacher::with($teacherID);
+        $discipline->bind($teacher);
+    }
+
+    public function action_unbind() {
+        $this->user->checkAccess(User::RIGHTS_TEACHER);
+        
+        $id = (int) $this->request->post('id');
+        $discipline = Model_Discipline::load($id);
+        if ($discipline->AuthorID != $this->user->TeacherID)
+            throw new LogicException(Error::ACCESS_DENIED);
+
+        $teacherID = (int) $this->request->post('teacherID');
+        $teacher = Model_Teacher::with($teacherID);
+        $discipline->unbind($teacher);
+    }
+}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Handler/ErrMessages.php b/~dev_rating/application/classes/Controller/Handler/ErrMessages.php
index 891737de1f52d181dadf749a69654c500860a801..b6e1878ab1415fec2fa9b9e7e742cb987c172367 100644
--- a/~dev_rating/application/classes/Controller/Handler/ErrMessages.php
+++ b/~dev_rating/application/classes/Controller/Handler/ErrMessages.php
@@ -1,64 +1,60 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Controller_Handler_ErrMessages extends Controller_Handler {
-
-        /** @var  Model_errMessages */
-        protected $model;
-
-        public function before() {
-            $this->model = new Model_errMessages;
-            $this->setAccessLevel(self::ACCESS_USER);
-            parent::before();
-        }
-
-        public function action_getRequests() {
-			$data = $this->model->getRequests($this->user->ID);
-
-            $i =0;
-            $res = array();
-            foreach ($data as $row)
-            {
-                $res[$i] = $row;
-                ++$i;
-            }
-            $res['num'] = --$i;
-
-			$this->response->body(json_encode($res));
-        }
-
-        public function action_createRequest() {
-         	$title = $_POST['title'];
-         	$text = $_POST['text'];
-            $result = $this->model->newRequest($this->user->ID, $title, $text);
-
-            // todo: use twig
-            $to = 'it.lab.mmcs@gmail.com';
-            $subject = "Request {$result[0]['Num']}: rating system report";
-
-            $message = "Faculty: {$this->user->FacultyName}\n";
-            $message .= "Type: {$this->user->Type}\n";
-
-            if ($this->user->Type === "teacher") {
-                $message .= "Department: {$this->user['DepName']}\n";
-            } elseif ($this->user->Type === 'student') {
-                $message .= sprintf("Degree: %s  Grade: %s  Group: %s\n",
-                    $this->user['Degree'], $this->user['GradeNum'], $this->user['GroupNum']);
-            }
-
-            $message .= sprintf("Sender: %s %s %s\n\n",
-                $this->user->LastName, $this->user->FirstName, $this->user->SecondName);
-
-            $message .= "Title: " . $title . "\n";
-            $message .= "Message: " . $text;
-
-            $headers = "From: RatingSystem@no-reply.mmcs.sfedu.ru\n";
-            $headers .= "Reply-To: " . $this->user['EMail'];
-
-            $data['success'] = true;
-            mail($to, $subject, $message, $headers);
-
-            $data['success'] = ($result[0]['Num'] > 0);
-
-            $this->response->body(json_encode($data));
-	    }
+class Controller_Handler_ErrMessages extends Controller_Handler
+{
+    public function action_getRequests() {
+        $this->user->checkAccess(User::RIGHTS_ADMIN);  // todo: is it?
+
+        $data = $this->getReports();
+        $data['num'] = count($data) - 1;
+        $this->response->body(json_encode($data));
+    }
+
+    private function getReports() {
+        $query = 'CALL `GetRequests`(0, 1000, :account, "all")';
+        return DB::query(Database::SELECT, $query)
+            ->param(':account', $this->user->ID)
+            ->execute()->as_array();
+    }
+
+
+    public function action_createRequest() {
+        $this->user->checkAccess(User::RIGHTS_STUDENT | User::RIGHTS_TEACHER);
+
+        $title = $_POST['title'];
+        $text = $_POST['text'];
+
+        // constructing mail body
+        $to = 'it.lab.mmcs@gmail.com';
+
+        $ticket = $this->sendNewRequest($this->user->ID, $title, $text);
+        $subject = "Request {$ticket}: rating system report";
+
+        $message = Twig::factory('handler/report', [
+            'Title' => $title,
+            'Text'  => $text,
+            'User'  => $this->user,
+        ])->render();
+
+        $headers = [
+            'From: RatingSystem@no-reply.mmcs.sfedu.ru',
+            'Reply-To: ' . $this->user->EMail,
+//            'Content-Type: text/html; charset=UTF-8',
+        ];
+
+        mail($to, $subject, $message, implode("\n", $headers));
+
+        $data['success'] = ($ticket > 0);
+        $this->response->body(json_encode($data));
+    }
+
+    /** return int  number of created ticket */
+    private function sendNewRequest($accountID, $title, $description) {
+        $sql = "SELECT `CreateRequest`(:account, :title, :description) AS 'Num';";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':account', (int) $accountID)
+            ->param(':description', $description)
+            ->param(':title', $title)
+            ->execute()[0]['Num'];
+    }
 }
diff --git a/~dev_rating/application/classes/Controller/Handler/FileCreator.php b/~dev_rating/application/classes/Controller/Handler/FileCreator.php
index fc5083c91a78a9d2f5a8fc1c7b9b9fa43a34e9af..296b1e5fc72edc443fbd3fc028a9907a80664be9 100644
--- a/~dev_rating/application/classes/Controller/Handler/FileCreator.php
+++ b/~dev_rating/application/classes/Controller/Handler/FileCreator.php
@@ -6,7 +6,7 @@ class Controller_Handler_FileCreator extends Controller_Handler
     // Параметризация ведется по типу аттестации и по этапу сдачи
     private $ColumnsPositions = array(
         "exam" => array(
-            1 => array (
+            0 => array (
                 'Index' => 'A',
                 'Name' => 'B',
                 'Total' => 'G',
@@ -17,9 +17,20 @@ class Controller_Handler_FileCreator extends Controller_Handler
                 'RateString' => 'K',
                 'RightestColumn' => 'L'
             ),
+            2 => array (
+                'Index' => 'A',
+                'Name' => 'B',
+                'Total' => 'G',
+                'Semester' => 'H',
+                'Bonus' => 'I',
+                'Extra' => 'J',
+                'Exam'=> 'K',
+                'RateString' => 'L',
+                'RightestColumn' => 'M'
+            ),
         ),
         "credit" => array(
-            1 => array (
+            0 => array (
                 'Index' => 'A',
                 'Name' => 'B',
                 'Total' => 'H',
@@ -30,29 +41,36 @@ class Controller_Handler_FileCreator extends Controller_Handler
                 'RateString' => 'K',
                 'RightestColumn' => 'L'
             ),
-        ),
-        "grading_credit" => array(
-            1 => array (
+            2 => array (
                 'Index' => 'A',
                 'Name' => 'B',
                 'Total' => 'H',
                 'Semester' => 'I',
                 'Bonus' => 'J',
-                'Extra' => 0,
+                'Extra' => 'K',
                 'Exam'=> 0,
-                'RateString' => 'K',
-                'RightestColumn' => 'L'
+                'RateString' => 'L',
+                'RightestColumn' => 'M'
             ),
         ),
-    );
+    ); // остальные данные о позициях копируются в функции before()
 
     public function before() {
-        $this->setAccessLevel(self::ACCESS_USER);
+        // копирование настроек полей для других типов аттестации и этапов
+        $this->ColumnsPositions['exam'][1] = $this->ColumnsPositions['exam'][0];
+        $this->ColumnsPositions['exam'][3] = $this->ColumnsPositions['exam'][2];
+        $this->ColumnsPositions['credit'][1] = $this->ColumnsPositions['credit'][0];
+        $this->ColumnsPositions['credit'][3] = $this->ColumnsPositions['credit'][2];
+        for($i=0;$i<4;++$i)
+            $this->ColumnsPositions['grading_credit'][$i] = $this->ColumnsPositions['credit'][$i];
+
         parent::before();
     }
 
     // Таблица баллов (со страницы оценивания) [dev version]
     public function action_GenerateExcelRatingTable() {
+        $this->user->checkAccess(User::RIGHTS_TEACHER | User::RIGHTS_DEAN);
+
         $xls = new PHPExcel();
 
         // Устанавливаем индекс активного листа
@@ -165,14 +183,27 @@ class Controller_Handler_FileCreator extends Controller_Handler
     // Ведомость
     public function action_GenerateFinalForm()
     {
+        $this->user->checkAccess(User::RIGHTS_DEAN);
+
+        $this->post
+            ->rule('disciplineID', 'not_empty')
+            ->rule('disciplineID', 'digit')
+            ->rule('groupID', 'not_empty')
+            ->rule('groupID', 'digit')
+            ->rule('stage', 'not_empty')
+            ->rule('stage', 'digit', array(0, 1, 2, 3));
+        if(!$this->post->check())
+            throw new HTTP_Exception(417, "Некорректные параметры запроса!");
+
         // parameters
         $disciplineID = $this->post['disciplineID'];
-        $groupID = $this->post['studyGroupID'];
+        $groupID = $this->post['groupID'];
+        $stage = $this->post['stage'];
 
         // make form from template
         $info = Model_Rating::getFinalFormInfo($disciplineID, $groupID)[0];
         $info['DisciplineID'] = $disciplineID;
-        $this->printDisciplineToExcelFile($objPHPExcel, $disciplineID, $groupID, $info);
+        $this->printDisciplineToExcelFile($objPHPExcel, $disciplineID, $groupID, $info, $stage);
 
         // prepare filename
         $grade = $info["GradeNum"];
@@ -186,7 +217,7 @@ class Controller_Handler_FileCreator extends Controller_Handler
         $objWriter->save('php://output');
     }
 
-    public function printDisciplineToExcelFile(&$objPHPExcel, $disciplineID, $groupID, $headerData) {
+    public function printDisciplineToExcelFile(&$objPHPExcel, $disciplineID, $groupID, $headerData, $stage) {
         $useNewForms = true;
         if ($headerData["FacultyID"] == 2)
             $useNewForms = false;
@@ -195,9 +226,11 @@ class Controller_Handler_FileCreator extends Controller_Handler
         if ($type === 'grading_credit')
             $type = 'credit';
 
-        $templateFile = DOCROOT."docs/template $type.xls";
-        if (!$useNewForms)
-            $templateFile = DOCROOT."docs/old template $type.xls";
+        $templateFile = DOCROOT."docs/old template $type.xls";
+        if ($useNewForms) {
+            $stageSuffix = $stage < 2 ? "0 1" : "2 3";
+            $templateFile = DOCROOT . "docs/template $type $stageSuffix.xls";
+        }
 
         if (!file_exists($templateFile)) {
             exit("template wasn't found" . PHP_EOL);
@@ -206,21 +239,16 @@ class Controller_Handler_FileCreator extends Controller_Handler
         $objPHPExcel->setActiveSheetIndex(0);
 
         if ($useNewForms)
-            $this->printNewForm($objPHPExcel, $disciplineID, $groupID, $headerData);
+            $this->printNewForm($objPHPExcel, $disciplineID, $groupID, $headerData, $stage);
         else
             $this->printOldForm($objPHPExcel, $disciplineID, $groupID, $headerData);
     }
 
-    protected function printNewForm(&$objPHPExcel, $disciplineID, $groupID, $headerData) {
+    protected function printNewForm(&$objPHPExcel, $disciplineID, $groupID, $headerData, $stage) {
         // preparation
         $type = $headerData['ExamType'];
-        $stage = 1; // TODO: user should provide stage
         $rates = Model_Rating::getRatesForStudentsGroupByStage($disciplineID, $groupID, $stage);
 
-        $examHold = 1;
-        if ($type === 'exam')
-            $examHold = $this->checkExamIsHold($rates);
-
         // fill header
         $this->prepareSheetHeader($objPHPExcel, $type, $headerData);
 
@@ -231,12 +259,16 @@ class Controller_Handler_FileCreator extends Controller_Handler
         $sheet = $objPHPExcel->getActiveSheet();
 
         foreach($rates as $studentRates) {
-            $this->addStudentToSheetNew($sheet, $type, $studentRates, $rowNumber++, $index++, $stage, $examHold);
+            // проверяем дошел ли студент до этапа $stage или уже сдал
+            if (($stage >=2) &&
+                (((int)$studentRates['PreviousExam'] >= 22) || ((int)$studentRates['AutoPassed'] == 1)))
+                continue; // не пересдавал
+            $this->addStudentToSheetNew($sheet, $type, $studentRates, $rowNumber++, $index++, $stage);
         }
     }
 
     protected function addStudentToSheetNew(PHPExcel_Worksheet &$sheet,
-                                            $type, $studentRates, $rowIndex, $studentIndex, $stage, $examHold) {
+                                            $type, $studentRates, $rowIndex, $studentIndex, $stage) {
 
         $indPosition = $this->ColumnsPositions[$type][$stage]['Index']; // Номер
         $namePosition = $this->ColumnsPositions[$type][$stage]['Name'];  // ФИО
@@ -262,21 +294,22 @@ class Controller_Handler_FileCreator extends Controller_Handler
         $firstName = $studentRates['FirstName'];
         $secondName = $studentRates['SecondName'];
         $fullName = $lastName." ".$firstName." ".$secondName;
-        $ratesSet['semester'] = (int)$studentRates['regular'];
-        $ratesSet['bonus'] = (int)$studentRates['bonus'];
-        $ratesSet['extra'] = (int)$studentRates['extra'];
-        $ratesSet['exam'] = (int)$studentRates['exam'];
+        $ratesSet['Semester'] = (int)$studentRates['Semester'];
+        $ratesSet['Bonus'] = (int)$studentRates['Bonus'];
+        $ratesSet['Extra'] = (int)$studentRates['Extra'];
+        $ratesSet['Exam'] = (int)$studentRates['Exam'];
+        $ratesSet['Option'] = $studentRates['Option'];
         list($totalRateStr, $stringRate, $examRateStr) =
-            $this->formStringsForRates($ratesSet, $type, $examHold);
+            $this->formStringsForRates($ratesSet, $type, $stage > 0);
 
         $sheet  ->setCellValue($indPosition.$rowIndex, $studentIndex)
             ->setCellValue($namePosition.$rowIndex, $fullName)
             ->setCellValue($totalRatePosition.$rowIndex, $totalRateStr)
-            ->setCellValue($semesterRatePosition.$rowIndex, $ratesSet['semester'])
-            ->setCellValue($bonusRatePosition.$rowIndex, $ratesSet['bonus'])
+            ->setCellValue($semesterRatePosition.$rowIndex, $ratesSet['Semester'])
+            ->setCellValue($bonusRatePosition.$rowIndex, $ratesSet['Bonus'])
             ->setCellValue($stringRatePosition.$rowIndex, $stringRate);
         if ($extraRatePosition)
-            $sheet->setCellValue($extraRatePosition.$rowIndex, $ratesSet['extra']);
+            $sheet->setCellValue($extraRatePosition.$rowIndex, $ratesSet['Extra']);
         if ($examRatePosition)
             $sheet->setCellValue($examRatePosition.$rowIndex, $examRateStr);
     }
@@ -328,6 +361,8 @@ class Controller_Handler_FileCreator extends Controller_Handler
 
         $range = $objPHPExcel->getNamedRange("Discipline")->getRange();
         $sheet->setCellValue($range, $data['SubjectName']);
+        // fixme, if $data is instance of Model_Discipline, then
+        //   it should use the new notation: $data->subjectName
         $range = $objPHPExcel->getNamedRange("Group")->getRange();
         $sheet->setCellValue($range, $data['GroupNum']);
         $range = $objPHPExcel->getNamedRange("Subdivision")->getRange();
@@ -541,12 +576,14 @@ class Controller_Handler_FileCreator extends Controller_Handler
     }
 
     public function action_GenerateFinalFormsForGroup() {
+        $this->user->checkAccess(User::RIGHTS_DEAN);
+
         // parameters
         //$gradeID = $this->post['gradeID'];
         $groupID = $this->post['GroupID'];
 
         // preparation
-        $listDisciplines = Model_Disciplines::ofGroup($groupID);
+        $listDisciplines = Model_Group::with($groupID)->getDisciplines();
 
         $templateFile = DOCROOT."docs/template credit.xls";
         if (!file_exists($templateFile)) {
@@ -563,14 +600,12 @@ class Controller_Handler_FileCreator extends Controller_Handler
         $groupNum = 0;
 
 
-        foreach ($listDisciplines as $record) {
-                $disciplineID = $record['DisciplineID'];
-
-                $info = Model_Rating::getFinalFormInfo($disciplineID, $groupID);
+        foreach ($listDisciplines as $discipline) {
+                $info = Model_Rating::getFinalFormInfo($discipline->ID, $groupID);
                 $type = $info[0]['ExamType'];
                 if ($type == 'exam') {
-                continue;
-            }
+                    continue;
+                }
 
             if ($index > 0) {
                         // remove name ranges from active page
@@ -606,7 +641,7 @@ class Controller_Handler_FileCreator extends Controller_Handler
                     $groupNum = $info[0]['GroupNum'];
                 }
 
-                $this->printDisciplineToExcelFile($objPHPExcel, $disciplineID, $groupID, $info[0]);
+                $this->printDisciplineToExcelFile($objPHPExcel, $discipline->ID, $groupID, $info[0]);
                 $index++;
         }
 
@@ -632,24 +667,24 @@ class Controller_Handler_FileCreator extends Controller_Handler
 	protected function checkExamIsHold(&$studentsRates)
 	{
 		foreach($studentsRates as $studentInfo){
-            if ($studentInfo['exam'] >= 0)
+            if ($studentInfo['exam'] > 0)
 				return 1;
         }
 		return 0;
 	}
 
     protected function formStringsForRates($ratesSet, $type, $examHold){
-        $attestationAdmission = $ratesSet['semester'] + $ratesSet['extra'];
-        $total = $attestationAdmission + $ratesSet['bonus'] + $ratesSet['exam'];
+        $attestationAdmission = $ratesSet['Semester'] + $ratesSet['Extra'];
+        $total = $attestationAdmission + $ratesSet['Bonus'] + $ratesSet['Exam'];
         switch ($type) {
             case 'exam':
-                return $this->formRateOfFive($attestationAdmission, $ratesSet['exam'], $total, $examHold);
+                return $this->formRateOfFive($attestationAdmission, $ratesSet['Exam'], $total, $examHold, $ratesSet['Option']);
             case 'grading_credit': {
                 // emulate exam to call formRateOfFive
                 $ratesSet['exam'] = 22;
                 $ratesSet['semester'] -= 22;
                 $attestationAdmission -= 22;
-                $res = $this->formRateOfFive($attestationAdmission, $ratesSet['exam'], $total, $examHold);
+                $res = $this->formRateOfFive($attestationAdmission, $ratesSet['Exam'], $total, $examHold);
                 $t = $res[1];
                 switch($t) {
                     case 'неуд':
@@ -680,8 +715,19 @@ class Controller_Handler_FileCreator extends Controller_Handler
     }
 
     // Определяет оценку по пятибальной системе для экзамена
-    protected function formRateOfFive($examAdmission, $examRateValue, $totalRateValue, $examHold)
+    protected function formRateOfFive($examAdmission, $examRateValue, $totalRateValue, $examHold, $option = null)
     {
+        // особые случаи: неявка и автомат
+        if ($option == 'absence')
+            return array('', 'РЅ/СЏ', '');
+        if ($option == 'pass') {
+            if ($examAdmission == 60)
+                return array($totalRateValue, 'СѓРґРѕРІР»', '0');
+            else
+                return array('', 'автомат не допустим', '');
+        }
+
+        // стандартная ситуация с оцениванием
         if ($totalRateValue > 100)
             $totalRateValue = 100;
         $totalRateStr = '';
@@ -690,7 +736,9 @@ class Controller_Handler_FileCreator extends Controller_Handler
         if ($examHold != 0)
 		{
 			$examRateStr = $examRateValue;
-			if (($examAdmission < 38) or ($examRateValue < 22)) {
+			if ($examAdmission < 38) {
+                $rateOfFive = 'РЅ/Рґ';
+            } elseif ($examRateValue < 22) {
 				$rateOfFive = 'неуд';
 			} else {
 				$totalRateStr = $totalRateValue;
@@ -705,8 +753,8 @@ class Controller_Handler_FileCreator extends Controller_Handler
 		{
 			if ($examAdmission < 38) { // задолженник
 				//$totalRateStr = ' ';
-				$rateOfFive = 'неуд';
-				$examRateStr = '0';
+				$rateOfFive = 'РЅ/Рґ';
+				$examRateStr = '';
 			}
 		}
 
diff --git a/~dev_rating/application/classes/Controller/Handler/GetData.php b/~dev_rating/application/classes/Controller/Handler/GetData.php
index f98b3b743a9395d9471b002dd523a0c84309af96..637b683a8ef670ea03f4f793d53b1c57af1d190b 100644
--- a/~dev_rating/application/classes/Controller/Handler/GetData.php
+++ b/~dev_rating/application/classes/Controller/Handler/GetData.php
@@ -3,40 +3,34 @@
 /** Получение списка групп, курсов, предметов, и т.д. */
 class Controller_Handler_GetData extends Controller_Handler
 {
-    
     public function before() {
-        //$this->model = new Model_Rating;
-        $this->setAccessLevel(self::ACCESS_USER);
-        parent::before();
+        $this->user->checkAccess(User::RIGHTS_AUTHORIZED);  // todo: is it?
     }
 
-    // Получить список групп по ID курса
     public function action_GetGroups()
     {
 		$data['success'] = false;
         $this->post -> rule('GradeID', 'not_empty')
                     -> rule('GradeID', 'digit');
         if($this->post->check()) {
-            $data['data'] = Model_Groups::orderByGroups(
-                    $this->post['GradeID'], $this->user->FacultyID);
+            $data['data'] = Model_Faculty::with($this->user->FacultyID)
+                ->getGroups($this->post['GradeID']);
 
 			$data['success'] = true;
         }
         $this->response->body(json_encode($data));
     }
 
-    // Получить список групп по ID курса
     public function action_GetDisciplinesForGroup()
     {
         $data['success'] = false;
         $this->post -> rule('GroupID', 'not_empty')
             -> rule('GroupID', 'digit');
         if($this->post->check()) {
-            $group = $this->post['GroupID'];
-            $data['data'] = Model_Disciplines::ofGroup($group)->as_array();
+            $id = $this->post['GroupID'];
+            $data['data'] =  Model_Group::with($id)->getDisciplines($lazy = false);
             $data['success'] = true;
         }
         $this->response->body(json_encode($data));
     }
-
 }
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Handler/GetHelp.php b/~dev_rating/application/classes/Controller/Handler/GetHelp.php
deleted file mode 100644
index 68429c154b3843e001ad5bb05738edda31e31d28..0000000000000000000000000000000000000000
--- a/~dev_rating/application/classes/Controller/Handler/GetHelp.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-
-class Controller_Handler_GetHelp extends Controller {
-
-        public function action_indexStudent()
-        {
-            $twig = Twig::factory('text_content/indexStudent');
-            $this->response->body($twig);         
-        }
-        
-}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Handler/Map.php b/~dev_rating/application/classes/Controller/Handler/Map.php
index ad3e59eb540e7c65e5fb3e74f5380451672d3829..021b14179b1e2fc3ef56927c5da0cd2879d1a709 100644
--- a/~dev_rating/application/classes/Controller/Handler/Map.php
+++ b/~dev_rating/application/classes/Controller/Handler/Map.php
@@ -5,106 +5,23 @@ class Controller_Handler_Map extends Controller_Handler {
 		/** @var  Model_Map */
 		protected $model;
 
+        /** @var  Model_User_Teacher */
+        protected $user;
+
+
         public function before() {
-            $this->model = new Model_Map;
-            $this->setAccessLevel(self::ACCESS_USER);
             parent::before();
+
+            $this->user->checkAccess(User::RIGHTS_TEACHER);
+            $this->model = new Model_Map;
         }
+    
         
 		private function privateDeleteSubmodule($SubmoduleID) {
-			$result = $this->model->deleteSubmodule($this->user['TeacherID'], $SubmoduleID);
+			$result = $this->model->deleteSubmodule($this->user->TeacherID, $SubmoduleID);
 			return $result[0]['Num'];
 		}
-		
-		// Добавление преподавателем дисциплины
-		public function action_AddDiscipline() {
-			$data['success'] = false;
-            $this->post -> rule('Grade', 'not_empty')
-                        -> rule('Grade', 'digit')
-						-> rule('SubjectID', 'not_empty')
-                        -> rule('SubjectID', 'digit')
-						-> rule('BonusRate', 'not_empty')
-						-> rule('ExamType', 'not_empty')
-						-> rule('LectureCount', 'not_empty')
-                        -> rule('LectureCount', 'digit')
-						-> rule('PracticeCount', 'not_empty')
-                        -> rule('PracticeCount', 'digit')
-						-> rule('LabCount', 'not_empty')
-                        -> rule('LabCount', 'digit')
-						-> rule('FacultyID', 'not_empty')
-                        -> rule('FacultyID', 'digit');
-
-            if ($this->post->check()) {
-                    $result = Model_Discipline::create(
-						$this->user['TeacherID'],
-						$this->post['Grade'],
-						$this->post['SubjectID'],
-						$this->post['ExamType'],
-						$this->post['LectureCount'],
-						$this->post['PracticeCount'],
-						$this->post['LabCount'],
-						$this->post['FacultyID']
-					);
-					$data['DisciplineID'] = $result[0]['Num'];
-					if ($this->post['BonusRate'] == "true")
-						$result = $this->model->AddModuleBonus(
-							$this->user['TeacherID'],
-							$data['DisciplineID']
-						);
-					if ($data['DisciplineID'] > 0)
-						$data['success'] = true;
-			}
-			$this->response->body(json_encode($data));
-		}
 
-		// Удаление дисциплины
-		public function action_DeleteDiscipline() {
-			$data['success'] = false;
-            $this->post -> rule('DisciplineID', 'not_empty')
-                        -> rule('DisciplineID', 'digit');
-			if($this->post->check()) {
-				$result = $this->model->DeleteDiscipline(
-					$this->user['TeacherID'],
-					$this->post['DisciplineID']
-				);
-				if ($result[0]['Num'] == 0)
-					$data['success'] = true;
-			}
-			$this->response->body(json_encode($data));
-		}
-		
-		// Передача дисциплины
-		public function action_DelegateDiscipline() {
-			$data['success'] = false;
-            $this->post -> rule('NewAuthorID', 'not_empty')
-                        -> rule('NewAuthorID', 'digit')
-                       	-> rule('DisciplineID', 'not_empty')
-                        -> rule('DisciplineID', 'digit');
-			if($this->post->check()) {
-                $id = $this->post['DisciplineID'];
-				$BindTeachersList = Model_Teachers::getNamesForDiscipline($id);
-				$binded = false;
-				foreach ($BindTeachersList as $teacher)
-				{
-					if ($teacher['TeacherID'] == $this->post['NewAuthorID']) {
-						$binded = true;
-						break;
-					}
-				}
-				if ($binded == false) {
-					$result = $this->model->BindTeacher($this->user['TeacherID'], $this->post['NewAuthorID'], $this->post['DisciplineID']);
-				}
-
-				$result = $this->model->DelegateDiscipline(
-					$this->user['TeacherID'],
-					$this->post['NewAuthorID'],
-					$this->post['DisciplineID']
-				);
-				if ($result[0]['Num'] == 0)
-					$data['success'] = true;
-			}
-			$this->response->body(json_encode($data));
-		}
 	// --- Изменения базовых параметров дисциплины ---
 	
 		// Изменение предмета
@@ -116,7 +33,7 @@ class Controller_Handler_Map extends Controller_Handler {
                         -> rule('SubjectID', 'digit');
 			if($this->post->check()) {
 				$result = $this->model->ChangeDisciplineSubject(
-					$this->user['TeacherID'],
+					$this->user->TeacherID,
 					$this->post['DisciplineID'],
 					$this->post['SubjectID']
 				);
@@ -135,14 +52,14 @@ class Controller_Handler_Map extends Controller_Handler {
 			if($this->post->check()) {
 				if ($this->post['BonusRate'] == 'true') {
 					$result = $this->model->AddModuleBonus(
-						$this->user['TeacherID'],
+						$this->user->TeacherID,
 						$this->post['DisciplineID']
 					);
 					$data['action'] = 'add';
 				}
 				else {
 					$result = $this->model->DeleteModuleBonus(
-						$this->user['TeacherID'],
+						$this->user->TeacherID,
 						$this->post['DisciplineID']
 					);
 					$data['action'] = 'delete';
@@ -164,16 +81,9 @@ class Controller_Handler_Map extends Controller_Handler {
                         -> rule('GradeID', 'digit');
 
 			if($this->post->check()) {
-                if (Model_Discipline::exists($this->user['TeacherID'], $this->post['SubjectID'], $this->post['GradeID'])) {
-                    //throw HTTP_Exception::factory(403, "Дисциплина с таким курсом уже существует");
-                    $data = ['success' => false, 'code' => 1];
-                    $this->response->body(json_encode($data));
-                    return;
-                }
-
 				$result = Model_Discipline::changeGrade(
                     $this->post['DisciplineID'],
-					$this->user['TeacherID'],
+					$this->user->TeacherID,
 					$this->post['GradeID']
 				);
 				if ($result[0]['Num'] == 0)
@@ -189,7 +99,7 @@ class Controller_Handler_Map extends Controller_Handler {
 						-> rule('Control', 'not_empty');
 			if($this->post->check()) {
 				$result = $this->model->ChangeDisciplineControl(
-					$this->user['TeacherID'],
+					$this->user->TeacherID,
 					$this->post['DisciplineID'],
 					$this->post['Control']
 				);
@@ -211,7 +121,7 @@ class Controller_Handler_Map extends Controller_Handler {
                         -> rule('Type', 'digit');
 			if($this->post->check()) {
 				$result = $this->model->ChangeDisciplineHours(
-					$this->user['TeacherID'],
+					$this->user->TeacherID,
 					$this->post['DisciplineID'],
 					$this->post['Hours'],
 					$this->post['Type']
@@ -231,8 +141,8 @@ class Controller_Handler_Map extends Controller_Handler {
             $this->post -> rule('FacultyID', 'not_empty')
                         -> rule('FacultyID', 'digit');
             if($this->post->check()) {
-                $faculty = $this->post['FacultyID'];
-				$subjectsList = Model_Subjects::byFaculty($faculty);
+                $faculty = Model_Faculty::with($this->post['FacultyID']);
+				$subjectsList = $faculty->getSubjects();
 				$data['success'] = true;
 			}
 			$this->response->body(json_encode($subjectsList));
@@ -246,7 +156,7 @@ class Controller_Handler_Map extends Controller_Handler {
             if($this->post->check()) {
 				// Добавление модуля
                 $result = $this->model->AddModule(
-					$this->user['TeacherID'],
+					$this->user->TeacherID,
 					$this->post['DisciplineID'],
 					''
 				);
@@ -256,7 +166,7 @@ class Controller_Handler_Map extends Controller_Handler {
 					// Т.к. модуль должен содержать хотя бы
 					// 1 мероприятие
 					$result = $this->model->AddSubmodule(
-						$this->user['TeacherID'],
+						$this->user->TeacherID,
 						$data['moduleID'],
 						'0', //MaxRate
 						'',
@@ -279,7 +189,7 @@ class Controller_Handler_Map extends Controller_Handler {
                         -> rule('submoduleID', 'digit');
             if($this->post->check()) {
 					$result = $this->model->AddSubmodule(
-						$this->user['TeacherID'],
+						$this->user->TeacherID,
 						$this->post['submoduleID'],
 						'0', //MaxRate
 						'',
@@ -300,7 +210,7 @@ class Controller_Handler_Map extends Controller_Handler {
                         -> rule('ModuleID', 'digit')
 						-> rule('ModuleName', 'not_empty');
             if($this->post->check()) {
-                $result = $this->model->ChangeModuleName($this->user['TeacherID'], $this->post['ModuleID'], $this->post['ModuleName']);
+                $result = $this->model->ChangeModuleName($this->user->TeacherID, $this->post['ModuleID'], $this->post['ModuleName']);
 				if ($result[0]['Num'] == 0)
 					$data['success'] = true;
 			}
@@ -314,7 +224,7 @@ class Controller_Handler_Map extends Controller_Handler {
                         -> rule('SubmoduleID', 'digit')
 						-> rule('SubmoduleName', 'not_empty');
             if($this->post->check()) {
-                $result = $this->model->ChangeSubmoduleName($this->user['TeacherID'], $this->post['SubmoduleID'], $this->post['SubmoduleName']);
+                $result = $this->model->ChangeSubmoduleName($this->user->TeacherID, $this->post['SubmoduleID'], $this->post['SubmoduleName']);
 				if ($result[0]['Num'] == 0)
 					$data['success'] = true;
             }
@@ -330,7 +240,7 @@ class Controller_Handler_Map extends Controller_Handler {
 						-> rule('ModuleID2', 'digit');
             if($this->post->check()) {
 				$result = $this->model->SwapModuleOrder(
-					$this->user['TeacherID'],
+					$this->user->TeacherID,
 					$this->post['ModuleID1'],
 					$this->post['ModuleID2']
 				);
@@ -349,7 +259,7 @@ class Controller_Handler_Map extends Controller_Handler {
 						-> rule('SubmoduleID2', 'digit');
             if($this->post->check()) {
 				$result = $this->model->SwapSubmoduleOrder(
-					$this->user['TeacherID'],
+					$this->user->TeacherID,
 					$this->post['SubmoduleID1'],
 					$this->post['SubmoduleID2']
 				);
@@ -366,7 +276,7 @@ class Controller_Handler_Map extends Controller_Handler {
                         -> rule('ModuleID', 'digit');
             if($this->post->check()) {
                 $result = $this->model->deleteModule(
-					$this->user['TeacherID'],
+					$this->user->TeacherID,
 					$this->post['ModuleID']
 				);
 				$data['success'] = ($result[0]['Num'] == 0);
@@ -394,7 +304,7 @@ class Controller_Handler_Map extends Controller_Handler {
 						-> rule('ControlType', 'not_empty');
             if($this->post->check()) {
                  $result = $this->model->ChangeSubmoduleMaxAndControl(
-					$this->user['TeacherID'],
+					$this->user->TeacherID,
 					$this->post['SubmoduleID'],
 					$this->post['MaxRate'],
 					$this->post['ControlType']
@@ -413,7 +323,7 @@ class Controller_Handler_Map extends Controller_Handler {
 						-> rule('GroupID', 'not_empty')
 						-> rule('GroupID', 'digit');
             if($this->post->check()) {
-                $result = $this->model->BindGroup($this->user['TeacherID'], $this->post['DisciplineID'], $this->post['GroupID']);
+                $result = $this->model->BindGroup($this->user->TeacherID, $this->post['DisciplineID'], $this->post['GroupID']);
 				if ($result[0]['Num'] == 0)
 					$data['success'] = true;
 				$data['code'] = $result[0]['Num'];			
@@ -429,7 +339,7 @@ class Controller_Handler_Map extends Controller_Handler {
 						-> rule('GroupID', 'not_empty')
 						-> rule('GroupID', 'digit');
             if($this->post->check()) {
-                $result = $this->model->UnbindGroup($this->user['TeacherID'], $this->post['DisciplineID'], $this->post['GroupID']);
+                $result = $this->model->UnbindGroup($this->user->TeacherID, $this->post['DisciplineID'], $this->post['GroupID']);
 				if ($result[0]['Num'] == 0)
 					$data['success'] = true;
             }
@@ -444,7 +354,7 @@ class Controller_Handler_Map extends Controller_Handler {
 						-> rule('DisciplineID', 'not_empty')
 						-> rule('DisciplineID', 'digit');
             if($this->post->check()) {
-                $result = $this->model->BindStudent($this->user['TeacherID'], $this->post['DisciplineID'], $this->post['StudentID']);
+                $result = $this->model->BindStudent($this->user->TeacherID, $this->post['DisciplineID'], $this->post['StudentID']);
 				if ($result[0]['Num'] == 0)
 					$data['success'] = true;
             }
@@ -459,7 +369,7 @@ class Controller_Handler_Map extends Controller_Handler {
 						-> rule('DisciplineID', 'not_empty')
 						-> rule('DisciplineID', 'digit');
             if($this->post->check()) {
-                $result = $this->model->UnbindStudent($this->user['TeacherID'], $this->post['DisciplineID'], $this->post['StudentID']);
+                $result = $this->model->UnbindStudent($this->user->TeacherID, $this->post['DisciplineID'], $this->post['StudentID']);
 				if ($result[0]['Num'] == 0)
 					$data['success'] = true;
             }
@@ -473,13 +383,15 @@ class Controller_Handler_Map extends Controller_Handler {
 			if($this->post->check()) {
                 $grade = $this->post['GradeID'];
                 $faculty = $this->post['FacultyID'];
-				$groups = Model_Groups::orderByGroups($grade, $faculty);
+				$groups = Model_Faculty::with($faculty)->getGroups($grade);
             }
             $this->response->body(json_encode($groups));
 		}
 		
 		// Поиск студентов
  		public function action_SearchStudents() {
+			# TODO: bad post response
+
 			$this->post -> rule('GradeID', 'digit')
 						-> rule('GroupID', 'digit')
 						-> rule('FacultyID', 'digit')
@@ -496,37 +408,6 @@ class Controller_Handler_Map extends Controller_Handler {
 			}
             $this->response->body(json_encode($searchResult));
 		}
-		
-		
-		// Прикрепить преподавателя 
-		public function action_BindTeacher() {
-			$data['success'] = false;
-            $this->post -> rule('BindingTeacher', 'not_empty')
-                        -> rule('BindingTeacher', 'digit')
-						-> rule('DisciplineID', 'not_empty')
-						-> rule('DisciplineID', 'digit');
-            if($this->post->check()) {
-                $result = $this->model->BindTeacher($this->user['TeacherID'], $this->post['BindingTeacher'], $this->post['DisciplineID']);
-				if ($result[0]['Num'] == 0)
-					$data['success'] = true;
-            }
-			$this->response->body(json_encode($data));
-		}
-		
-		// Отсоединить преподавателя 
-		public function action_UnbindTeacher() {
-			$data['success'] = false;
-            $this->post -> rule('BindingTeacher', 'not_empty')
-                        -> rule('BindingTeacher', 'digit')
-						-> rule('DisciplineID', 'not_empty')
-						-> rule('DisciplineID', 'digit');
-            if($this->post->check()) {
-                $result = $this->model->UnbindTeacher($this->user['TeacherID'], $this->post['BindingTeacher'], $this->post['DisciplineID']);
-				if ($result[0]['Num'] == 0)
-					$data['success'] = true;
-            }
-			$this->response->body(json_encode($data));
-		}
 
 		// Получаем список кафедр 
 		public function action_GetDepartments() {
diff --git a/~dev_rating/application/classes/Controller/Handler/Rating.php b/~dev_rating/application/classes/Controller/Handler/Rating.php
index a6ad8b57686e14f4af5b26fdbe8bd15795543617..bf2ad78bad373f5ca0c3b82b740da3ebe10ce4db 100644
--- a/~dev_rating/application/classes/Controller/Handler/Rating.php
+++ b/~dev_rating/application/classes/Controller/Handler/Rating.php
@@ -6,24 +6,25 @@ class Controller_Handler_Rating extends Controller_Handler
     protected $model;
     
     public function before() {
-        $this->model = new Model_Rating;
-        $this->setAccessLevel(self::ACCESS_USER);
         parent::before();
+
+        $this->user->checkAccess(User::RIGHTS_TEACHER);
+        $this->model = new Model_Rating;
     }
 
     public function action_SetRate()
     {
 		$data['success'] = false;
-        $this->post -> rule('student', 'not_empty')
-                    -> rule('student', 'digit')
-                    -> rule('submodule', 'not_empty')
-                    -> rule('submodule', 'digit')
+        $this->post -> rule('studentID', 'not_empty')
+                    -> rule('studentID', 'digit')
+                    -> rule('submoduleID', 'not_empty')
+                    -> rule('submoduleID', 'digit')
                     -> rule('rate', 'digit')
-                    -> rule('rate', 'range', array(':value', 0, 100));
+                    -> rule('rate', 'range', array(':value', -1, 100));
         if($this->post->check()) {
-            $result = $this->model->SetStudentRate( $this->user['TeacherID'],
-                                                    $this->post['student'],
-                                                    $this->post['submodule'],
+            $result = Model_Rating::SetStudentRate( $this->user->TeacherID,
+                                                    $this->post['studentID'],
+                                                    $this->post['submoduleID'],
                                                     $this->post['rate']);
 			$data['success'] = ($result[0]['Num'] == 0);
         }
@@ -48,4 +49,30 @@ class Controller_Handler_Rating extends Controller_Handler
         $this->response->body(json_encode($data));
     }
 
+    public function action_SetExamPeriodOption() {
+        $data['success'] = false;
+        $this->post -> rule('studentID', 'not_empty')
+            -> rule('studentID', 'digit')
+            -> rule('submoduleID', 'not_empty')
+            -> rule('submoduleID', 'digit');
+
+        if($this->post->check()) {
+            // option check
+            $parametersCheckPassed = true;
+            switch ($this->post['option']) {
+                case 'null' :
+                case 'absence':
+                case 'pass':
+                    break;
+                default:
+                    $parametersCheckPassed = false;
+            }
+            if ($parametersCheckPassed) {
+                $res = Model_Rating::setExamPeriodOption($this->post['studentID'], $this->post['submoduleID'], $this->post['option']);
+                if ($res['ErrorCode'] == 0)
+                    $data['success'] = true;
+            }
+        }
+        $this->response->body(json_encode($data));
+    }
 }
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Handler/Session.php b/~dev_rating/application/classes/Controller/Handler/Session.php
index 2270f78d4da4f0d084008fcb60b555e93a1b8f95..137d66c1d4b1dd4e21826dc924cff4fdd16d85cd 100644
--- a/~dev_rating/application/classes/Controller/Handler/Session.php
+++ b/~dev_rating/application/classes/Controller/Handler/Session.php
@@ -1,20 +1,17 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Controller_Handler_Session extends Controller_Handler {
-        /** @var  User */
-        protected $_user;   # $user is already defined in the parent class.
-        
+class Controller_Handler_Session extends Controller_Handler
+{
         public function before() {
-            $this->_user = User::instance(true);
-            parent::before();
-            $this->setAccessLevel(self::ACCESS_ANYBODY);
+            if (!$this->request->is_ajax())
+                throw new HTTP_Exception_404();
+            $this->user = User::instance(false);
         }
 
         public function action_getSessionTime() {
-            $user = $this->_user;
             $session = Session::instance();
-            
-            if (!$user->isSignedIn()) {
+
+            if (!$this->user->isSignedIn()) {
                 $remain = 0;
             } else {
                 $start_time = $session->get('start_time');
@@ -24,17 +21,15 @@ class Controller_Handler_Session extends Controller_Handler {
                 $interval = time() - $start_time;
                 $config = Kohana::$config->load('session');
                 $lifetime = $config["native"]["lifetime"];
-                $remain = $lifetime - $interval; 
+                $remain = $lifetime - $interval;
             }
             $this->response->body(json_encode($remain));
         }
 
-        
-        
+
+
         public function action_closeSession() {
-            if (User::instance()->isSignedIn()) {
-                User::instance()->signOut();
-            }
+            User::instance()->signOut();
             $this->response->body(json_encode(0));
         }
 }
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Handler/Settings.php b/~dev_rating/application/classes/Controller/Handler/Settings.php
index b22524db99e7c267fc8cbebf4e5273857994faa0..4ef96b5c221d67321ccbde50604a04c2e8736d1b 100644
--- a/~dev_rating/application/classes/Controller/Handler/Settings.php
+++ b/~dev_rating/application/classes/Controller/Handler/Settings.php
@@ -3,8 +3,9 @@
 class Controller_Handler_Settings extends Controller_Handler {
        
         public function before() {
-            $this->setAccessLevel(self::ACCESS_USER);
-            parent::before();   
+            parent::before();
+
+            $this->user->checkAccess(User::RIGHTS_AUTHORIZED);
         }
 
         public function action_changeLogin()
@@ -60,6 +61,8 @@ class Controller_Handler_Settings extends Controller_Handler {
         
         public function action_editProfile()
         {
+            $this->user->checkAccess(User::RIGHTS_TEACHER);
+
             $this->post
                     ->rule('firstName', 'not_empty')
                     // ->rule('firstName', 'alpha_dash', array(':value', TRUE))
@@ -101,7 +104,7 @@ class Controller_Handler_Settings extends Controller_Handler {
                 ->rule('semesterID', 'digit');
             if($this->post->check()) {
                 $semesterID = $this->post['semesterID'];
-                User::instance()->SetSemester($semesterID);
+                User::instance()->SemesterID = $semesterID;  // todo: should work fine
             }
         }
 }
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Handler/Sign.php b/~dev_rating/application/classes/Controller/Handler/Sign.php
index 65f588f43db28ed50d2838fbbf4c9126b4fbf28e..ad13de7070cbb9b436d512ce14d40b255018372c 100644
--- a/~dev_rating/application/classes/Controller/Handler/Sign.php
+++ b/~dev_rating/application/classes/Controller/Handler/Sign.php
@@ -3,25 +3,25 @@
 class Controller_Handler_Sign extends Controller_Handler {
         
         public function before() {
-            $this->setAccessLevel(self::ACCESS_GUEST);
             parent::before();
         }
 
         public function action_in()
         {
             $this->post->rule('login', 'email')->rule('login', 'not_empty');
-            $checklogin = true; $response['success'] = false;
+            $checkLogin = true;
+            $response['success'] = false;
             if(!$this->post->check())
             {
                 $this->post = Validation::factory($this->post->data());
                 $this->post->rule('login', 'alpha_dash')->rule('login', 'not_empty');
                 if(!$this->post->check())
                 {
-                    // Данные не безопасны, даже не пытаемся авторизоваться
-                    $checklogin = false;
+                    // Data is not safe, don't even try to authorize
+                    $checkLogin = false;
                 }
             }
-            if($checklogin)
+            if($checkLogin)
             {
                 $response['success'] = User::instance()
                         ->signIn($this->post['login'],
@@ -78,9 +78,9 @@ class Controller_Handler_Sign extends Controller_Handler {
             if($this->post->check())
             {
                 $email = $this->post['email'];
-                if(Account::instance()->isMailExists($email))
+                if(Account::isMailValid($email))
                 {
-                    Account::instance()->createRecoveryRequest($this->post['email']);
+                    Account::createRecoveryRequest($this->post['email']);
                     $response['success'] = true;
                 }
                 else
@@ -102,9 +102,9 @@ class Controller_Handler_Sign extends Controller_Handler {
             if($this->post->check())
             {
                 $token = $this->post['token'];
-                if(Account::instance()->checkToken($token))
+                if(Account::checkToken($token))
                 {
-                    Account::instance()->changePasswordByToken($token, $this->post['password']);
+                    Account::changePasswordByToken($token, $this->post['password']);
                     $response['success'] = true;
                 }
             }
diff --git a/~dev_rating/application/classes/Controller/Index.php b/~dev_rating/application/classes/Controller/Index.php
new file mode 100644
index 0000000000000000000000000000000000000000..2633a11087096aa227e0f426b185a81e6ff29e67
--- /dev/null
+++ b/~dev_rating/application/classes/Controller/Index.php
@@ -0,0 +1,14 @@
+<?php defined('SYSPATH') or die('No direct script access.');
+
+class Controller_Index extends Controller
+{
+    // the entire point for site
+    public function action_index() {
+        $user = User::instance();
+
+        // todo: problem: dean helper must be a teacher
+        $request = ($user->isSignedIn()) ? $user->Type . '/index' : 'sign';
+        $page = Request::factory($request)->execute();
+        $this->response->body($page);
+    }
+}
diff --git a/~dev_rating/application/classes/Controller/Student/Index.php b/~dev_rating/application/classes/Controller/Student/Index.php
index 3b8a4afd4d13d8e9b1a781404626825ef96607ee..c2148dccd588bf3d0cba5c36cabf3a66f94e6bdd 100644
--- a/~dev_rating/application/classes/Controller/Student/Index.php
+++ b/~dev_rating/application/classes/Controller/Student/Index.php
@@ -1,54 +1,30 @@
 <?php defined('SYSPATH') or die('No direct script access.');
  
-class Controller_Student_Index extends Controller_UserEnvironment {
-
+class Controller_Student_Index extends Controller_Environment_Student
+{
     public function action_index() {
-        $student_id = $this->user['StudentID'];
-        $disciplines = Model_Disciplines::ofStudent($student_id);
-
-        $list = array();
-        foreach ($disciplines as $row) {
-            $row['Title'] = $row['SubjectName'];
+        $student_id = $this->user->StudentID;
+        $disciplines = Model_Student::load($student_id)->getDisciplines();
+        $teachers = [];
 
-            if ($row['Subtype'] == 'disciplinary_coursework')
-                $row['Teachers'] = ['Курсовая'];
-            elseif ($row['Subtype'] == 'scientific_coursework')
-                $row['Teachers'] = ['Науч. рук.'];
-            else
-                $row['Teachers'] = self::getTeachersForDiscipline($row['ID']);
+        foreach ($disciplines as $dis) {
+            // todo: Pavel will wrote an optimized query GetTeachersListForStudent
+            if (!$dis->Subtype)
+                $teachers[$dis->ID] = $dis->getTeachers();
 
-            $row['Control'] = DataHelper::LocalizeExamType($row['ExamType']);
-            $row['ColorScheme'] = Model_Subjects::getECTSMark($row['Rate'], $row['MaxCurrentRate'], $row['ExamRate']);
-            $list[] = $row;
+            # fixme: ExamRate is not defined in the `GetDisciplinesForStudent` function!
+            $dis->ColorScheme = Model_Subject::getECTSMark($dis->Rate, $dis->MaxCurrentRate, NULL /*$dis['examRate']*/);
         }
 
-        $twig = Twig::factory('student/index');
-        if (count($disciplines) > 0)
-            $twig->disciplines = $list;
-        $twig->User = $this->user;
-        $twig->Semester = $this->SemesterInfo;
-        $twig->SemesterList = Model_Semesters::toArray();
-        $this->response->body($twig);
-    }
-
-    /**
-     * @param $id int discipline id
-     * @return array list of short-form names
-     */
-    private static function getTeachersForDiscipline($id) {
-        $teachers = Model_Teachers::ofDiscipline($id);
-
-        $list = array();
-        foreach ($teachers as $teacher)
-            $list[] = DataHelper::AbbreviateName($teacher);
-
-        return $list;
+        $this->twig->set([
+            'Teachers'     => $teachers,
+            'Disciplines'  => $disciplines,
+            'SemesterList' => Model_Semesters::loadAll(),
+        ])->set_filename(static::STUDENT . 'index');
     }
 
     public function action_settings() {
-        $twig = Twig::factory('settings');
-        $twig->User = $this->user;
-        $this->response->body($twig);
+        $this->twig->set_filename('settings');
     }
 }
             
diff --git a/~dev_rating/application/classes/Controller/Student/Subject.php b/~dev_rating/application/classes/Controller/Student/Subject.php
index d7c3aa9ee23264aec8fe1f288a7701cf8405d6da..d95e98ed28051a2cc88c69a07f4524249c5b92f4 100644
--- a/~dev_rating/application/classes/Controller/Student/Subject.php
+++ b/~dev_rating/application/classes/Controller/Student/Subject.php
@@ -1,121 +1,117 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Controller_Student_Subject extends Controller_UserEnvironment {
-
-    public function action_show()
-    {
+class Controller_Student_Subject extends Controller_Environment_Student
+{
+    public function action_show() {
         $id = $this->request->param('id');
-        $student = $this->user['StudentID'];
-        $discipline = Model_Rating::getRates($id, $student);
-        $info = Model_Discipline::getInfo($id);
-        
-        // Информация о предмете
-        $subject['Title'] = $info['SubjectName'];
-		$subject['Control'] = DataHelper::LocalizeExamType($info['ExamType']);
-        $subject['ExamType'] = $info['ExamType'];
-        $subject['LectureCount'] = $info['LectureCount'];
-        $subject['PracticeCount'] = $info['PracticeCount'];
-		$subject['LabCount'] = $info['LabCount'];
-        $subject['DepName'] = $info['DepName'];
-        $subject['Teachers'] = $this->getTeachersForDiscipline($id);
-        $semester = Model_Semesters::getInfo($info['SemesterID']);
-        $semester['Num'] = $semester['Num'] == 1 ? 'Осенний' : 'Весенний';
-        $subject['Num'] = $semester['Num'];
-        $subject['Year'] = $semester['Year'];
-        // Учебная карта дисциплины
-        $disciplineHandled = array();
-        $sRate = 0; $sMaxRate = 0;
-        $bonusMaxRate = 0;
-        $examRate = 0; $examMaxRate = 0;
-        $i = 0; $id = 0;
-		$disciplineHandled['Extra']['Rate'] = 0;
-
-        foreach($discipline as $row)
-        {
-            if($row['ModuleType'] == 'exam')
-            {
-                $disciplineHandled['Exam']['Rate'] = (int) $row['Rate'];
-                $disciplineHandled['Exam']['MaxRate'] = (int) $row['MaxRate'];
-                $disciplineHandled['Exam']['Date'] = $row['Date'];
-                $examRate += $row['Rate'];
-                $examMaxRate += (int) $row['MaxRate'];
-            }
-            else if($row['ModuleType'] == 'bonus')
-            {
-                $disciplineHandled['Bonus']['Description'] = $row['Description'];
-                $disciplineHandled['Bonus']['Rate'] = (int) $row['Rate'];
-                $disciplineHandled['Bonus']['MaxRate'] = (int) $row['MaxRate'];
-                $disciplineHandled['Bonus']['Date'] = $row['Date'];
-                $bonusRate += $row['Rate'];
-                $bonusMaxRate += (int) $row['MaxRate'];
-            }
-			else if($row['ModuleType'] == 'extra') {
-				$disciplineHandled['Extra']['Description'] = $row['Description'];
-                $disciplineHandled['Extra']['Rate'] += (int) $row['Rate'];
-                $extraRate += (int) $row['Rate'];
-			}
-			
-            else
-            {
-                if($row['ModuleID'] != $id)
-                {
-                    $i++;
-                    $id = $row['ModuleID'];
-                }
-
-                if(!isset($disciplineHandled['Modules'][$i]['SubmodulesCount']))
-                {
-                    $disciplineHandled['Modules'][$i]['SubmodulesCount'] = 0;
-                    $disciplineHandled['Modules'][$i]['Rate'] = 0;
-                    $disciplineHandled['Modules'][$i]['MaxRate'] = 0;
-                }
-
-                $j = $disciplineHandled['Modules'][$i]['SubmodulesCount'] += 1;
-                $disciplineHandled['Modules'][$i]['Rate'] += (int) $row['Rate'];
-                $disciplineHandled['Modules'][$i]['MaxRate'] += (int) $row['MaxRate'];
-                $disciplineHandled['Modules'][$i]['Title'] = $row['ModuleName'];
-
-                $disciplineHandled['Modules'][$i]['Submodules'][$j]['Title'] = $row['SubmoduleName'];
-                $disciplineHandled['Modules'][$i]['Submodules'][$j]['Description'] = $row['SubmoduleDescription'];
-                $disciplineHandled['Modules'][$i]['Submodules'][$j]['Rate'] = (int) $row['Rate'];
-                $disciplineHandled['Modules'][$i]['Submodules'][$j]['Date'] = $row['Date'];
-                $disciplineHandled['Modules'][$i]['Submodules'][$j]['MaxRate'] = (int) $row['MaxRate'];
-                $sRate += (int) $row['Rate'];
-                $sMaxRate += (int) $row['MaxRate'];
-            }
+        $discipline = Model_Discipline::load($id);
+        $rates = Model_Rating::getRates($id, $this->user->StudentID);
+
+        $this->twig->set([
+            'Discipline'    => $discipline,
+            'Teachers'      => self::getTeachersListOf($discipline),
+            'DisciplineMap' => self::generateDisciplineMapFrom($rates),
+            'Semester'      => Model_Semesters::load($discipline->SemesterID),
+        ])->set_filename(static::STUDENT . 'subject');
+    }
 
+    private static function &getTeachersListOf(Model_Discipline $discipline) {
+        $teachers = $discipline->getTeachers()->as_array();
+
+        foreach ($teachers as &$t) {
+            $name = [ $t['LastName'], $t['FirstName'], $t['SecondName'] ];
+            $t['Name'] = trim(implode($name, ' '));
         }
-        $disciplineHandled['ModulesCount'] = $i;
-
-        $disciplineHandled['SemesterRate'] = (int) $sRate;
-        $disciplineHandled['SemesterMaxRate'] = (int) $sMaxRate;
-        $disciplineHandled['ExamRate'] = (int) $examRate;
-        $disciplineHandled['ExamMaxRate'] = (int) $examMaxRate;
-        $disciplineHandled['BonusRate'] = (int) $bonusRate;
-        $disciplineHandled['BonusMaxRate'] = (int) $bonusMaxRate;
-        $disciplineHandled['ExtraRate'] = (int) $extraRate;
-
-        // ПРЕДСТАВЛЕНИЕ 
-        $twig = Twig::factory('student/subject');
-        $twig->User = $this->user;
-        $twig->Discipline = $subject;
-        $twig->DisciplineMap = $disciplineHandled;
-
-        $this->response->body($twig);
+
+        return $teachers;
     }
-    
-    protected function getTeachersForDiscipline($id) {
-        $teachers = Model_Teachers::ofDiscipline($id);
-        $teachersHandled = array(); $i = 0;
-        foreach ($teachers as $teacher)
-        {
-            $i++;
-            $teachersHandled[$i] = $teacher['LastName'].' '.$teacher['FirstName'].' ';
-            if(!empty($teacher['SecondName']))
-            {
-                $teachersHandled[$i] .= $teacher['SecondName'];
+
+    private static function generateDisciplineMapFrom(Database_Result $rates) {
+        $id = 0;                   # not sure, what it is about :(
+        $sRate = 0;                # completely legacy code, baby
+        $sMaxRate = 0;
+        $extraRate = 0;
+        $bonusRate = 0;
+        $bonusMaxRate = 0;
+        $examRate = 0;
+        $examMaxRate = 0;
+        $disMap = array();
+        $modulesCount = 0;
+        $disMap['Extra']['Rate'] = 0;
+
+        foreach ($rates as $row) {
+            switch ($row['ModuleType']) {
+                case 'exam':
+                    $examRate += $row['Rate'];
+                    $examMaxRate += (int)$row['MaxRate'];
+
+                    $disMap['Exam'] = array(
+                        'Rate'    => (int)$row['Rate'],
+                        'MaxRate' => (int)$row['MaxRate'],
+                        'Date'    => $row['Date'],
+                    );
+                    break;
+
+                case 'bonus':
+                    $bonusRate += $row['Rate'];
+                    $bonusMaxRate += (int)$row['MaxRate'];
+
+                    $disMap['Bonus'] = array(
+                        'Description' => $row['Description'],
+                        'Rate'        => (int)$row['Rate'],
+                        'MaxRate'     => (int)$row['MaxRate'],
+                        'Date'        => $row['Date'],
+                    );
+                    break;
+
+                case 'extra':
+                    $extraRate += (int)$row['Rate'];
+
+                    $disMap['Extra']['Description'] = $row['Description'];
+                    $disMap['Extra']['Rate'] += (int)$row['Rate'];
+                    break;
+
+                default:
+                    $sRate += (int)$row['Rate'];
+                    $sMaxRate += (int)$row['MaxRate'];
+
+                    if ($row['ModuleID'] != $id) {
+                        $id = $row['ModuleID'];
+                        $modulesCount++;
+                    }
+
+                    $module =& $disMap['Modules'][$modulesCount];
+
+                    if (!isset($module['SubmodulesCount'])) {
+                        $module['Rate'] = 0;
+                        $module['MaxRate'] = 0;
+                        $module['SubmodulesCount'] = 0;
+                    }
+
+                    $module['Title']    = $row['ModuleName'];
+                    $module['Rate']     += (int)$row['Rate'];
+                    $module['MaxRate']  += (int)$row['MaxRate'];
+                    $module['SubmodulesCount']++;
+
+                    $module['Submodules'][] = array(
+                        'Date'        => $row['Date'],
+                        'Title'       => $row['SubmoduleName'],
+                        'Description' => $row['SubmoduleDescription'],
+                        'Rate'        => (int)$row['Rate'],
+                        'MaxRate'     => (int)$row['MaxRate'],
+                    );
             }
         }
-        return $teachersHandled;
-    }        
-}          
\ No newline at end of file
+        $disMap['ModulesCount'] = $modulesCount;
+
+        $disMap['SemesterRate'] = (int)$sRate;
+        $disMap['SemesterMaxRate'] = (int)$sMaxRate;
+        $disMap['ExamRate'] = (int)$examRate;
+        $disMap['ExamMaxRate'] = (int)$examMaxRate;
+        $disMap['BonusRate'] = (int)$bonusRate;
+        $disMap['BonusMaxRate'] = (int)$bonusMaxRate;
+        $disMap['ExtraRate'] = (int)$extraRate;
+
+        return $disMap;
+    }
+}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Teacher/Discipline.php b/~dev_rating/application/classes/Controller/Teacher/Discipline.php
deleted file mode 100644
index c6c4eb479184ba315596ec49b6549c062a934842..0000000000000000000000000000000000000000
--- a/~dev_rating/application/classes/Controller/Teacher/Discipline.php
+++ /dev/null
@@ -1,228 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-
-class Controller_Teacher_Discipline extends Controller_UserEnvironment {
-
-    /** Создание дисциплины. */
-    public function action_create_discipline() {
-        $twig = Twig::factory('teacher/discipline/CreateDiscipline');
-
-        $twig->User = $this->user;
-        $twig->FacultiesList = Model_Faculties::toArray();
-        $twig->SubjectsList = Model_Subjects::byFaculty($this->user['FacultyID']);
-        $twig->GradesList = Model_Grades::toArray();
-
-        $this->response->body($twig);
-    }
-
-    /** Создание курсовой. */
-    public function action_create_coursework() {
-        $twig = Twig::factory('teacher/discipline/CreateCoursework');
-
-        $twig->User = $this->user;
-        $twig->FacultiesList = Model_Faculties::toArray();
-        $twig->SubjectsList = Model_Subjects::byFaculty($this->user['FacultyID']);
-        $twig->GradesList = Model_Grades::toArray();
-
-        $this->response->body($twig);
-    }
-    
-    public function action_EditSettings() {
-        $twig = Twig::factory('teacher/discipline/EditSettings');
-        $id = $this->request->param('id');
-
-        $twig->User = $this->user;
-        $twig->Discipline = $this->GetDisciplineInfo($id);
-        $twig->SubjectsList = Model_Subjects::byFaculty($this->user['FacultyID']);
-        $twig->GradesList = Model_Grades::toArray();
-        
-        $this->response->body($twig);
-    }
-
-    public function action_EditStructure() {
-        $twig = Twig::factory('teacher/discipline/EditStructure');
-        $id = $this->request->param('id');
-
-        $twig->User = $this->user;
-        $twig->Discipline = $this->GetDisciplineInfo($id);
-        $twig->Map = $this->GetMapInfo(Model_Map::getMapForDiscipline($id));
-        
-        $this->response->body($twig);
-    }
-    
-    public function action_EditGroups() {
-        $twig = Twig::factory('teacher/discipline/EditGroups');
-        $id = $this->request->param('id');
-
-        $twig->User = $this->user;
-        $twig->Discipline = $this->GetDisciplineInfo($id);
-        $twig->GroupsForDiscipline = Model_Groups::forDiscipline($id);
-        $twig->Groups = Model_Groups::orderByGroups($twig->Discipline['GradeID'], $twig->Discipline['FacultyID']);
-        
-        $this->response->body($twig);
-    }
-    
-    public function action_EditStudents() {
-        $twig = Twig::factory('teacher/discipline/EditStudents');
-        $id = $this->request->param('id');
-
-        $twig->User = $this->user;
-        $twig->Discipline = $this->GetDisciplineInfo($id);
-        $twig->GradesList = Model_Grades::toArray();
-        $twig->GroupsList = Model_Groups::orderByGroups($twig->Discipline['GradeID'], $twig->Discipline['FacultyID']);
-
-        $students = Model_Students::ofDiscipline($id);
-        $stdHandled = array();
-        $attachStdHandled = array();
-        $groupID = 0; 
-        $i = 0; 
-        $k = 0;
-        $n = 0;
-        $j = 0;
-        foreach($students as $row) {
-            if ($row['AttachType'] == 'attach'){
-                if ($row['GroupID'] != $groupID) {
-                    $groupID = $row['GroupID'];
-                    $k++;
-                    $n = 0;
-                    $attachStdHandled[$k]['GroupID'] = $row['GroupID'];
-                    $attachStdHandled[$k]['GradeID'] = $row['GradeID'];
-                    $attachStdHandled[$k]['GradeNum'] = $row['GradeNum'];
-                    $attachStdHandled[$k]['GroupNum'] = $row['GroupNum'];
-                    $attachStdHandled[$k]['Degree'] = Model_Grades::getDegreeTitle($row['Degree']);
-                }
-                $n++;
-                $attachStdHandled[$k]['students'][$n]['ID'] = $row['ID'];
-                $attachStdHandled[$k]['students'][$n]['LastName'] = $row['LastName'];
-                $attachStdHandled[$k]['students'][$n]['FirstName'] = $row['FirstName'];
-                $attachStdHandled[$k]['students'][$n]['SecondName'] = $row['SecondName'];
-                $attachStdHandled[$k]['students'][$n]['AttachType'] = $row['AttachType'];
-
-                // $k++;
-                // $attachStdHandled['StdCount'] += 1;
-                // $attachStdHandled[$k]['StudentID'] = $row['StudentID'];
-                // $attachStdHandled[$k]['LastName'] = $row['LastName'];
-                // $attachStdHandled[$k]['FirstName'] = $row['FirstName'];
-                // $attachStdHandled[$k]['SecondName'] = $row['SecondName'];
-                // $attachStdHandled[$k]['StudentID'] = $row['StudentID'];
-                // $attachStdHandled[$k]['GroupID'] = $row['GroupID'];
-                // $attachStdHandled[$k]['GradeID'] = $row['GradeID'];
-                // $attachStdHandled[$k]['GradeNum'] = $row['GradeNum'];
-                // $attachStdHandled[$k]['GroupNum'] = $row['GroupNum'];
-                // $attachStdHandled[$k]['Degree'] = $row['Degree'];
-            }
-            else
-            {
-                if ($row['GroupID'] != $groupID) {
-                    $groupID = $row['GroupID'];
-                    $i++;
-                    $j = 0;
-                    $stdHandled[$i]['GroupID'] = $row['GroupID'];
-                    $stdHandled[$i]['GradeID'] = $row['GradeID'];
-                    $stdHandled[$i]['GradeNum'] = $row['GradeNum'];
-                    $stdHandled[$i]['GroupNum'] = $row['GroupNum'];
-                    $stdHandled[$i]['Degree'] = Model_Grades::getDegreeTitle($row['Degree']);
-                }
-                $j++;
-                $stdHandled[$i]['students'][$j]['ID'] = $row['ID'];
-                $stdHandled[$i]['students'][$j]['LastName'] = $row['LastName'];
-                $stdHandled[$i]['students'][$j]['FirstName'] = $row['FirstName'];
-                $stdHandled[$i]['students'][$j]['SecondName'] = $row['SecondName'];
-                $stdHandled[$i]['students'][$j]['AttachType'] = $row['AttachType'];
-            }
-
-        }
-        $twig->Groups = $stdHandled;
-        $twig->GroupsAttached = $attachStdHandled;
-
-        $this->response->body($twig);
-    }
-    
-    public function action_EditTeachers() {
-        $twig = Twig::factory('teacher/discipline/EditTeachers');
-        $id = $this->request->param('id');
-
-        $twig->User = $this->user;
-        $twig->Discipline = $this->getDisciplineInfo($id);
-        $twig->BindTeachersList = Model_Teachers::getNamesForDiscipline($id);
-        $twig->FacultiesList = Model_Faculties::toArray();
-        $twig->Departments = Model_Departments::byFaculty($this->user['FacultyID']);
-        
-        $this->response->body($twig);
-    }
-    
-    private function GetMapInfo($map) {
-        $mapHandled = array();
-
-        $maxRate = 0; $i = 0; $module = 0;
-        foreach($map as $row)
-        {
-            if ($row['ModuleType'] == 'extra')
-                continue;
-            if($row['ModuleID'] != $module)
-            {
-                $i++;
-                $module = $row['ModuleID'];
-                $mapHandled[$i]['ModuleID'] = $row['ModuleID'];
-                $mapHandled[$i]['ModuleType'] = $row['ModuleType'];
-                if ($row['ModuleType'] == 'bonus')
-                    $mapHandled['isSetBonus'] = true;
-                $mapHandled[$i]['CurrentControl'] = 0;
-                $mapHandled[$i]['LandmarkControl'] = 0;
-            }
-            if(!isset($mapHandled[$i]['SubmodulesCount']))
-            {
-                $mapHandled[$i]['SubmodulesCount'] = 0;
-                $mapHandled[$i]['MaxRate'] = 0;
-            }
-            $mapHandled[$i]['IsExam'] = $row['IsExam'];
-            $j = $mapHandled[$i]['SubmodulesCount'] += 1;
-            $mapHandled[$i]['MaxRate'] += (int) $row['MaxRate'];
-            $mapHandled[$i]['ModuleTitle'] = $row['ModuleName'];
-            $mapHandled[$i][$j]['SubmoduleID'] = $row['SubmoduleID'];
-            $mapHandled[$i][$j]['Title'] = $row['SubmoduleName'];
-            $mapHandled[$i][$j]['Description'] = $row['SubmoduleDescription'];
-            $mapHandled[$i][$j]['SubmoduleControl'] = $row['SubmoduleType'];
-            $mapHandled[$i][$j]['MaxRate'] = (int) $row['MaxRate'];
-            $maxRate += $row['MaxRate'];
-            if ($row['SubmoduleType'] == 'CurrentControl')
-                 $mapHandled[$i]['CurrentControl'] += (int) $row['MaxRate'];
-            if ($row['SubmoduleType'] == 'LandmarkControl')
-                 $mapHandled[$i]['LandmarkControl'] += (int) $row['MaxRate'];
-        }
-        $mapHandled['ModulesCount'] = $i;
-        $mapHandled['MaxRate'] = (int) $maxRate; 
-        if ($mapHandled['isSetBonus'] == true)
-            $mapHandled['MaxRate'] = $mapHandled['MaxRate'] - 10;
-
-        return $mapHandled;
-    }
-    
-    public function GetDisciplineInfo($id)
-    {
-        $discipline = Model_Discipline::getInfo($id);
-        if ($this->user['TeacherID'] != $discipline['AuthorID'])
-           throw HTTP_Exception::factory(403, "Недостаточно прав для редактирования.");
-
-        $semester = Model_Semesters::getInfo($discipline['SemesterID']);
-        $discipline['SemesterNum'] = $semester['SemesterNum'] == 1 ? 'Осенний' : 'Весенний';
-        $discipline['SemesterYear'] = $semester['SemesterYear'];
-
-        $discipline['LectureHours'] = $discipline['LectureCount'];
-        $discipline['PracticeHours'] = $discipline['PracticeCount'];
-        $discipline['LabHours'] = $discipline['LabCount'];
-
-        $teachers = Model_Teachers::getNamesForDiscipline($id);
-
-        $list = array();
-        foreach ($teachers as $row) {
-            $name = $row['LastName'] . ' ' . $row['FirstName'];
-            if (!empty($row['SecondName']))
-                $name .= ' ' . $row['SecondName'];
-            $list[] = $name;
-        }
-        $discipline['Teachers'] = implode(', ', $list);
-        
-        return $discipline;
-    }
-}
-            
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Teacher/Discipline/Create.php b/~dev_rating/application/classes/Controller/Teacher/Discipline/Create.php
new file mode 100644
index 0000000000000000000000000000000000000000..72098ee6729fdc3a128b0105fc67c59ca8960ad8
--- /dev/null
+++ b/~dev_rating/application/classes/Controller/Teacher/Discipline/Create.php
@@ -0,0 +1,23 @@
+<?php defined('SYSPATH') or die('No direct script access.');
+
+class Controller_Teacher_Discipline_Create extends Controller_Environment_Teacher
+{
+    public function action_create_discipline() {
+        $this->twig->set([
+            'FacultiesList' => Model_Faculties::load(),
+            'SubjectsList'  => Model_Faculty::with($this->user->FacultyID)->getSubjects(),
+            'GradesList'    => Model_Grades::toArray(),
+        ])->set_filename('teacher/discipline/create');
+    }
+
+    # todo: move to Coursework folder
+    # don't refactor this, i know it's a duplicate
+    public function action_create_coursework() {
+        $this->twig->set([
+            'FacultiesList' => Model_Faculties::load(),
+            'SubjectsList'  => Model_Faculty::with($this->user->FacultyID)->getSubjects(),
+            'GradesList'    => Model_Grades::toArray(),
+        ])->set_filename('teacher/coursework/create');
+    }
+}
+            
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Teacher/Discipline/Edit.php b/~dev_rating/application/classes/Controller/Teacher/Discipline/Edit.php
new file mode 100644
index 0000000000000000000000000000000000000000..db7a3c227a76588c910ca8c9864e5bbc1d74e5d2
--- /dev/null
+++ b/~dev_rating/application/classes/Controller/Teacher/Discipline/Edit.php
@@ -0,0 +1,141 @@
+<?php defined('SYSPATH') or die('No direct script access.');
+
+class Controller_Teacher_Discipline_Edit extends Controller_Environment_Teacher
+{
+    /** @var  Model_Discipline */
+    private $discipline;
+
+    const twigSource = 'teacher/discipline/edit/';
+
+
+    public function before() {
+        parent::before();
+
+        $id = (int) $this->request->param('id');
+        $this->discipline = Model_Discipline::load($id);
+        if ($this->discipline->AuthorID != $this->user->TeacherID)
+            throw HTTP_Exception::factory(403, "Недостаточно прав для редактирования.");
+
+        $section = $this->request->param('section');
+        $this->twig->set_filename(static::twigSource . $section);
+        $this->twig->Discipline = $this->discipline;
+    }
+
+
+    public function action_edit_settings() {
+        $this->twig->SubjectsList = Model_Faculty::with($this->user->FacultyID)->getSubjects();
+        $this->twig->GradesList   = Model_Grades::toArray();
+    }
+
+    public function action_edit_structure() {
+        $map = Model_Map::getMapForDiscipline($this->discipline->ID);
+        $this->twig->Map = $this->getMapInfo($map);
+    }
+    
+    public function action_edit_groups() {
+        $this->twig->set([
+            'GroupsForDiscipline' => $this->discipline->getGroups(),
+            'Groups'              => Model_Faculty::with($this->discipline->FacultyID)
+                                        ->getGroups($this->discipline->GradeID),
+        ]);
+    }
+    
+    public function action_edit_students() {
+        $this->manageGroups($this->discipline, $students, $attached);
+
+        $this->twig->set([
+            'Groups'         => $students,
+            'GroupsAttached' => $attached,
+            'GradesList'     => Model_Grades::toArray(),
+            'GroupsList'     => Model_Faculty::with($this->discipline->FacultyID)
+                                    ->getGroups($this->discipline->GradeID),
+        ]);
+    }
+    
+    public function action_edit_teachers() {
+        $this->twig->set([
+            'FacultiesList'    => Model_Faculties::load(),
+            'Departments'      => Model_Departments::byFaculty($this->user->FacultyID),
+            'BindTeachersList' => Model_Teachers::getNamesForDiscipline($this->discipline->ID),
+        ]);
+    }
+
+
+    private function getMapInfo($map) {
+        $maxRate = $i = $module = 0;
+        $mapHandled = [];
+
+        foreach ($map as $row) {
+            if ($row['ModuleType'] == 'extra') {
+                continue;
+            }
+
+            if ($row['ModuleID'] != $module) {
+                $i++;
+                $module = $row['ModuleID'];
+                $mapHandled[$i]['ModuleID'] = $row['ModuleID'];
+                $mapHandled[$i]['ModuleType'] = $row['ModuleType'];
+                if ($row['ModuleType'] == 'bonus') {
+                    $mapHandled['isSetBonus'] = true;
+                }
+                $mapHandled[$i]['CurrentControl'] = 0;
+                $mapHandled[$i]['LandmarkControl'] = 0;
+            }
+
+            if (!isset($mapHandled[$i]['SubmodulesCount'])) {
+                $mapHandled[$i]['SubmodulesCount'] = 0;
+                $mapHandled[$i]['MaxRate'] = 0;
+            }
+
+            $mapHandled[$i]['IsExam'] = $row['IsExam'];
+            $j = $mapHandled[$i]['SubmodulesCount'] += 1;
+            $mapHandled[$i]['MaxRate'] += (int)$row['MaxRate'];
+            $mapHandled[$i]['ModuleTitle'] = $row['ModuleName'];
+            $mapHandled[$i][$j]['SubmoduleID'] = $row['SubmoduleID'];
+            $mapHandled[$i][$j]['Title'] = $row['SubmoduleName'];
+            $mapHandled[$i][$j]['Description'] = $row['SubmoduleDescription'];
+            $mapHandled[$i][$j]['SubmoduleControl'] = $row['SubmoduleType'];
+            $mapHandled[$i][$j]['MaxRate'] = (int)$row['MaxRate'];
+            $maxRate += $row['MaxRate'];
+
+            if ($row['SubmoduleType'] == 'CurrentControl') {
+                $mapHandled[$i]['CurrentControl'] += (int)$row['MaxRate'];
+            } elseif ($row['SubmoduleType'] == 'LandmarkControl') {
+                $mapHandled[$i]['LandmarkControl'] += (int)$row['MaxRate'];
+            }
+        }
+
+        $mapHandled['ModulesCount'] = $i;
+        $mapHandled['MaxRate'] = (int)$maxRate;
+        if ($mapHandled['isSetBonus'] == true) {
+            $mapHandled['MaxRate'] = $mapHandled['MaxRate'] - 10;
+        }
+
+        return $mapHandled;
+    }
+
+    private function manageGroups(Model_Discipline $discipline, &$std, &$attached) {
+        $students = Model_Students::ofDiscipline($discipline->ID);
+        $groupID = $i = $k = $n = $j = 0;
+        $attached = $std = [];
+
+        foreach ($students as $row) {
+            if ($row['GroupID'] != $groupID) {
+                $groupID = $row['GroupID'];
+
+                if ($row['AttachType'] == 'attach') {
+                    $attached[++$k] = $row;
+                } else {
+                    $std[++$i] = $row;
+                }
+            }
+
+            if ($row['AttachType'] == 'attach') {
+                $attached[$k]['students'][] = $row;
+            } else {
+                $std[$i]['students'][] = $row;
+            }
+        }
+    }
+}
+            
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Teacher/Index.php b/~dev_rating/application/classes/Controller/Teacher/Index.php
index baf9fb467046c0abcfe2f6cec1dfb306aacd440a..5d5465f83fb67849ffd5fa43f67720fcc98414a9 100644
--- a/~dev_rating/application/classes/Controller/Teacher/Index.php
+++ b/~dev_rating/application/classes/Controller/Teacher/Index.php
@@ -1,81 +1,49 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Controller_Teacher_Index extends Controller_UserEnvironment {
+class Controller_Teacher_Index extends Controller_Environment_Teacher
+{
+    public function action_index() {
+        $teacher = Model_Teacher::with($this->user->TeacherID);
+        $disciplines = $teacher->getDisciplines();
+        $subjID = $discID = $gradeNum = $i = 0;
+        $subjects = $teachers = $groups = [];
 
-    public function action_index()
-    {
-        $disciplines = Model_Disciplines::ofTeacher($this->user['TeacherID']);
-        $subjID = $discID = $gradeNum = $i = $j = $k = 0; // Combo!!!
-        $disciplinesHandled = array();
-        $groupsInDiscipline = array();
-        
-        foreach ($disciplines as $row) {
-            if($subjID != $row['SubjectID'] || $gradeNum != $row['GradeID'])
-            {
-                $i++; $j = $k = 0;
-                $groupsInDiscipline = array();
-                $subjID = $row['SubjectID'];
-                $gradeNum = $row['GradeID'];
-                $disciplinesHandled[$i]['Title'] = $row['SubjectName'];
-                $disciplinesHandled[$i]['GradeNum'] = $row['GradeNum'];
-                $disciplinesHandled[$i]['Degree'] = Model_Grades::getDegreeTitle($row['Degree']);
-                               
+        foreach ($disciplines as $dis) {
+            // group disciplines by subjectID & gradeID
+            if ($subjID != $dis->SubjectID || $gradeNum != $dis->GradeID) {
+                $subjID = $dis->SubjectID;
+                $gradeNum = $dis->GradeID;
+
+                $subjects[++$i] = [
+                    'SubjectName' => $dis->SubjectName,
+                    'GradeNum'    => $dis->GradeNum,
+                    'Degree'      => $dis->Degree,
+                ];
             }
-            
-            if($discID != $row['ID'])
-            {
-                $j++; $k = 0;
-                $groupsInDiscipline = array();
-                $disciplinesHandled[$i]['Disciplines'][$j]['IsAuthor'] = $row['IsAuthor'];
-                $disciplinesHandled[$i]['Disciplines'][$j]['IsLocked'] = $row['IsLocked'];
-                $disciplinesHandled[$i]['Disciplines'][$j]['IsMapCreated'] = $row['IsMapCreated'];
-                $disciplinesHandled[$i]['Disciplines'][$j]['ID'] = $discID = $row['ID'];
-                $controlType =& $disciplinesHandled[$i]['Disciplines'][$j]['ControlType'];
-                $teachers =& $disciplinesHandled[$i]['Disciplines'][$j]['Teachers'];
 
-                if (in_array($row['Subtype'], ['scientific_coursework', 'disciplinary_coursework']))
-                    $controlType = 'Курсовая';
-                else
-                    $controlType = DataHelper::LocalizeExamType($row['ExamType']);
+            if ($discID != $dis->ID) {
+                $discID = $dis->ID;
+                $subjects[$i]['Disciplines'][] = $dis;
+            }
 
-                if ($row['Subtype'] == 'scientific_coursework')
-                    $teachers = ['Сотрудники кафедры'];
-                else
-                    $teachers = self::getTeachersForDiscipline($row['ID']);
+            $scientific = $dis->Subtype == Model_CourseWork::SCIENTIFIC;
 
-                //$disciplinesHandled[$i]['Disciplines'][$j]['Teachers'] = $this->getTeachersForDiscipline($discID);
-            }
-            if($row['GroupNum'] != 0)
-                $groupsInDiscipline[++$k] = $row['GroupNum'].' РіСЂ.';
-            $disciplinesHandled[$i]['Disciplines'][$j]['Groups'] = implode(', ', $groupsInDiscipline);
-        } //!for_each
+            // todo: Pavel will write an optimized query
+            if (!$scientific && !$teachers[$dis->ID])
+                $teachers[$dis->ID] = $dis->getTeachers();
+            if (isset($dis->GroupNum) && $dis->GroupNum)
+                $groups[$dis->ID][] = $dis->GroupNum . ' РіСЂ.';
+        }
 
-        $twig = Twig::factory('teacher/index');
-        $twig->Subjects = $disciplinesHandled;
-        $twig->SemesterList = Model_Semesters::toArray();
-        $twig->Semester = $this->SemesterInfo;
-        $twig->User = $this->user;
-        $this->response->body($twig);
+        $this->twig->set([
+            'Subjects'     => $subjects,
+            'Teachers'     => $teachers,
+            'Groups'       => $groups,
+            'SemesterList' => Model_Semesters::loadAll(),
+        ])->set_filename('teacher/index');
     }
     
     public function action_settings() {
-        $twig = Twig::factory('settings');
-        $twig->User = $this->user;
-        $this->response->body($twig);
-    }
-    
-    protected function getTeachersForDiscipline($id) {
-        $teachers = Model_Teachers::ofDiscipline($id);
-        $teachersHandled = array(); $i = 0;
-        foreach ($teachers as $teacher)
-        {
-            $i++;
-            $teachersHandled[$i] = $teacher['LastName'].' '.UTF8::substr($teacher['FirstName'], 0, 1).'. ';
-            if(!empty($teacher['SecondName']))
-            {
-                $teachersHandled[$i] .= UTF8::substr($teacher['SecondName'], 0, 1).'.';
-            }
-        }
-        return $teachersHandled;
+        $this->twig->set_filename('settings');
     }
 }
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Teacher/Profile.php b/~dev_rating/application/classes/Controller/Teacher/Profile.php
index af79ecf33dfd3a72bb665b23dac6d16b6de74500..8e30fa84ba4b3a501f36fbfe7195f274481d9049 100644
--- a/~dev_rating/application/classes/Controller/Teacher/Profile.php
+++ b/~dev_rating/application/classes/Controller/Teacher/Profile.php
@@ -1,43 +1,12 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Controller_Teacher_Profile extends Controller_UserEnvironment {
-    public function action_edit()
-    {
-        $twig = Twig::factory('profile/settings');
-        $twig->JobPositions = $this->getJobPositions();
-        $twig->Faculties = $this->getFaculties();
-        $twig->Departments = Model_Departments::byFaculty($this->user->FacultyID);
-        $twig->User = $this->user;
-        $this->response->body($twig);
+class Controller_Teacher_Profile extends Controller_Environment_Teacher
+{
+    public function action_index() {
+        $this->twig->set([
+            'JobPositions'  => Model_Teachers::getJobPositions(),
+            'Faculties'     => Model_Teachers::getFaculties(),
+            'Departments'   => Model_Departments::byFaculty($this->user->FacultyID),
+        ])->set_filename('profile/settings');
     }
-    
-    public function getFaculties()
-    {
-        $faculties = Model_Teachers::getFaculties();
-        $facultiesHandled = array(); $i = 0;
-        foreach($faculties as $row)
-        {
-            $i++;
-            $facultiesHandled[$i]['ID'] = $row['ID'];
-            $facultiesHandled[$i]['Name'] = $row['Name'];
-            $facultiesHandled[$i]['Abbr'] = $row['Abbr'];
-        }
-        return $facultiesHandled;
-    }
-
-    // todo: move to teachers model, there's a duplicate at admin/teachers.php
-    public function getJobPositions()
-    {
-        $jobPositions = Model_Teachers::getJobPositions();
-        $jobPositionsHandled = array(); $i = 0;
-        foreach($jobPositions as $row)
-        {
-            $i++;
-            $jobPositionsHandled[$i]['ID'] = $row['ID'];
-            $jobPositionsHandled[$i]['Name'] = $row['Name'];
-            // $jobPositionsHandled[$i]['Abbr'] = $row['Abbr'];
-        }
-        return $jobPositionsHandled;
-    }    
 }
-            
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/Teacher/Rating.php b/~dev_rating/application/classes/Controller/Teacher/Rating.php
index c9e88d539c9cdd6ed98bc65d6954552771b58938..22a98cffe2f62c63cafe2927bf3f1da7c748b52a 100644
--- a/~dev_rating/application/classes/Controller/Teacher/Rating.php
+++ b/~dev_rating/application/classes/Controller/Teacher/Rating.php
@@ -1,63 +1,40 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Controller_Teacher_Rating extends Controller_UserEnvironment {
-    /** @var  Model_Rating */
-    protected $model_rating;
-
-    /** @var  Model_Map */
-    protected $model_discipline;
-
+class Controller_Teacher_Rating extends Controller_Environment_Teacher
+{
     public function before() {
-        Cookie::set('fD', 'true'); // Ставим кук fD, чтоб иметь возможность скачать отчет TODO
-
-        $this->model_rating = new Model_Rating;
-        $this->model_discipline = new Model_Map;
         parent::before();
+
+        // make it possible to download files
+        Cookie::set('fD', 'true');
     }
 
     // Получить из кука SGID выбранную ранее группу для данной дисциплины
-    private function getGroupID_ForFilter($id) {
-        # $id = disciplineID
-        $SG_array = json_decode(Cookie::get('SGID', null), true);
-        if ($SG_array !== null && array_key_exists($id, $SG_array)) {
-                return $SG_array[$id];
+    private function getFilterGroupID($disciplineID) {
+        $groups = json_decode(Cookie::get('SGID', null), true);
+        if ($groups && isset($groups[$disciplineID])) {
+            return $groups[$disciplineID];
         }
         return 0;
     }
 
-    // Настройки дисциплины и выбранная группа(для фильтра)
-    private function getDisciplineInformation($id) {
-        
-        $temp = Model_Discipline::getInfo($id);
-        $disciplineInfo = $temp;
-//        $disciplineInfo['ID'] = $id;
-        $disciplineInfo['GroupID_Filter'] = $this->getGroupID_ForFilter($id);
-
-        return $disciplineInfo;
-    }
-
     // Шапка таблицы: структура УКД (модули и мероприятия)
-    private function getStructure($id, $type)
-    {
-        $teacherID = $this->user['TeacherID'];
-        if ($type == "rating") {
-            $structure = $this->model_rating->getMapForDiscipline($id);
-        } else {
-            $structure = $this->model_rating->GetMapForDisciplineExam($id);
-        }
-        if($structure->count() == 0) {
-            throw HTTP_Exception::factory (404, "Страница не найдена");
+    private function getStructure($id, $type) {
+        $structure = ($type == "rate")
+            ? Model_Rating::getMapForDiscipline($id)
+            : Model_Rating::getMapForDisciplineExam($id);
+
+        if ($structure->count() == 0) {
+            throw HTTP_Exception::factory(404, "Страница не найдена");
         }
-        
-        $structureHandled = array();
+
+        $structureHandled = [];
         $maxRate = $i = 0;
         $temp_moduleID = -1;
         $try = 0; // try = 1 - экзамен, = 2, 3 - пересдачи
 
-        
-        foreach($structure as $row) {
-            if($row['ModuleID'] != $temp_moduleID)
-            {
+        foreach ($structure as $row) {
+            if ($row['ModuleID'] != $temp_moduleID) {
                 ++$i; // todo
                 $temp_moduleID = $row['ModuleID'];
                 $structureHandled[$i]['SubmodulesCount'] = 0;
@@ -69,19 +46,17 @@ class Controller_Teacher_Rating extends Controller_UserEnvironment {
             $j = $structureHandled[$i]['SubmodulesCount'] += 1;
             $structureHandled[$i]['MaxRate'] += (int) $row['MaxRate'];
 
-            $cur_submodule = array();
             $cur_submodule = $row;
-            $cur_submodule['MaxRate'] = (int)$cur_submodule['MaxRate'];
-            
-            if ($type == "rating") {
+            $cur_submodule['MaxRate'] = (int) $cur_submodule['MaxRate'];
+
+            if ($type == "rate") {
                 $cur_submodule['Title'] = $row['SubmoduleName'];
                 $maxRate += $row['MaxRate'];
             } else { //$type == "exam"
                 if ($row['ModuleType'] == 'extra') {
                     $cur_submodule['Title'] = 'Добор баллов';
                     $maxRate += $row['MaxRate'];
-                }
-                else {
+                } else {
                     if ($try === 0) {
                         $cur_submodule['Title'] = 'Основная сдача';
                     } else {
@@ -96,37 +71,36 @@ class Controller_Teacher_Rating extends Controller_UserEnvironment {
         $structureHandled['MaxRate'] = (int) $maxRate;
         return $structureHandled;
     }
-    
-    private function processGroupInfo($groupInfo) 
-    {
+
+    private function processGroupInfo($groupInfo) {
         //GroupID, GroupNum, GradeNum, isAttached etc.
         $out = $groupInfo;
-        
+
         //Формирование заголовка курса
         $gradeNum = $groupInfo['GradeNum'];
         if ($groupInfo['Degree'] == 'bachelor') {
-            $out['GradeTitle'] = $gradeNum.' РєСѓСЂСЃ';
+            $out['GradeTitle'] = $gradeNum . ' РєСѓСЂСЃ';
         } else if ($groupInfo['Degree'] == 'specialist') {
-            $out['GradeTitle'] = $gradeNum.' РєСѓСЂСЃ';
-        } if ($groupInfo['Degree'] == 'master') {
-            $out['GradeTitle'] = 'Магистратура, '.$gradeNum.' год';
+            $out['GradeTitle'] = $gradeNum . ' РєСѓСЂСЃ';
         }
-        
+        if ($groupInfo['Degree'] == 'master') {
+            $out['GradeTitle'] = 'Магистратура, ' . $gradeNum . ' год';
+        }
+
         //Формирование заголовка группы
-        $out['GroupTitle'] = $out['GradeTitle']." ".$groupInfo['GroupNum']." РіСЂСѓРїРїР°";
+        $out['GroupTitle'] = $out['GradeTitle'] . " " . $groupInfo['GroupNum'] . " РіСЂСѓРїРїР°";
         return $out;
     }
-    
-    private function getRatesForRatingPage($info)
-    {
 
-        $rates = array();
+    private function getRatesForRatingPage($info) {
+
+        $rates = [];
         $i_r = 0;
         $rateResult = 0;
 
-        foreach($info as $row) {
-             ++$i_r;
-            $cur_rate = array();
+        foreach ($info as $row) {
+            ++$i_r;
+            $cur_rate = [];
             $rateResult += $cur_rate['Rate'] = $row['Rate'];
             $moduleType = $row['ModuleType'];
             $cur_rate['Type'] = $moduleType;
@@ -139,92 +113,95 @@ class Controller_Teacher_Rating extends Controller_UserEnvironment {
             }
 
             $rates[$i_r] = $cur_rate;
-           
+
         }
         $rates['RateResult'] = $rateResult;
         return $rates;
     }
-    
+
     private function correctExtra(&$curStudent, $examType, $lastExtraIndex, $firstEmptyExtraIndex, $totalExtraRate) {
         $bottomLimit = 0;
         $maxExtraRate = 0;
         $topLimit = ($examType == 'exam') ? 38 : 60;
-        
-        if ($curStudent['RateSemesterResult'] >= $bottomLimit && 
-            $curStudent['RateSemesterResult'] < $topLimit) // студент задолженик
+
+        if ($curStudent['RateSemesterResult'] >= $bottomLimit &&
+            $curStudent['RateSemesterResult'] < $topLimit
+        ) // студент задолженик
         {
             $maxExtraRate = $topLimit - $curStudent['RateSemesterResult'];
         }
         if ($lastExtraIndex >= 0) {
             $curStudent['Rates'][$lastExtraIndex]['MaxRate'] = $maxExtraRate - $totalExtraRate
                 + $curStudent['Rates'][$lastExtraIndex]['Rate'];
-        } 
+        }
         if ($firstEmptyExtraIndex >= 0) {
             $curStudent['Rates'][$firstEmptyExtraIndex]['MaxRate'] = $maxExtraRate - $totalExtraRate;
         }
     }
-    
-    private function getRatesForExamPage(&$curStudent, $rate, $examType, $disciplineID)
-    {
+
+    private function getRatesForExamPage(&$curStudent, $rate, $examType, $disciplineID) {
         $rowIndex = 0;
         $lastExam = $lastExtraIndex = $lastNilExam = $firstEmptyExtra = -1;
         $rateExtra = 0;
 
         $curStudent['RateSemesterResult'] = 0;
-        foreach($rate as $curRate) {
+        foreach ($rate as $curRate) {
 
             if (($curRate['ModuleType'] == 'exam') or ($curRate['ModuleType'] == 'extra')) {
-                    $curStudent['Rates'][$rowIndex] = array();
-                    $curStudent['Rates'][$rowIndex]['SubmoduleID'] = $curRate['SubmoduleID'];
-                    $curStudent['Rates'][$rowIndex]['Rate'] = $curRate['Rate'];
-                    $curStudent['Rates'][$rowIndex]['ModuleType'] = $curRate['ModuleType'];
+                $curStudent['Rates'][$rowIndex] = [
+                    'SubmoduleID'      => $curRate['SubmoduleID'],
+                    'Rate'             => $curRate['Rate'],
+                    'ModuleType'       => $curRate['ModuleType'],
+                    'ExamPeriodOption' => $curRate['ExamPeriodOption'],
+                ];
             }
 
-            switch ($curRate['ModuleType'])
-            {
-            case 'regular':
-                    $curStudent['RateSemesterResult'] += $curRate['Rate'];
+            $rate = $curRate['Rate'];
+
+            switch ($curRate['ModuleType']) {
+                case 'regular':
+                    $curStudent['RateSemesterResult'] += $rate;
                     break;
-            case 'exam':
-                    if (!is_null($curRate['Rate'])) {
+                case 'exam':
+                    if (!is_null($rate)) {
                         if ($lastExam >= 0) {
                             $curStudent['Rates'][$lastExam]['Block'] = 'True';
                         }
                         $lastExam = $rowIndex;
                     } else {
-                            if ($lastNilExam < 0) {
-                                    $lastNilExam = $rowIndex;
-                            } else {
-                                    $curStudent['Rates'][$rowIndex]['Block'] = 'True';
-                            }
+                        if ($lastNilExam < 0) {
+                            $lastNilExam = $rowIndex;
+                        } else {
+                            $curStudent['Rates'][$rowIndex]['Block'] = 'True';
+                        }
                     }
                     break;
-            case 'bonus':
-                    $curStudent['Bonus'] = $curRate['Rate'];
+                case 'bonus':
+                    $curStudent['Bonus'] = $rate;
                     break;
-            case 'extra':
-                if ($curRate['Rate']) {
-                    if ($lastExtraIndex >= 0) {
-                        $curStudent['Rates'][$lastExtraIndex]['Block'] = 'True';
-                    }
-                    $lastExtraIndex = $rowIndex;
-                    $curStudent['Rate'] += $curRate['Rate'];
-                    $rateExtra += $curRate['Rate'];
-                } else {
-                    if ($firstEmptyExtra < 0) {
-                        $firstEmptyExtra = $rowIndex;
+                case 'extra':
+                    if ($rate) {
+                        if ($lastExtraIndex >= 0) {
+                            $curStudent['Rates'][$lastExtraIndex]['Block'] = 'True';
+                        }
+                        $lastExtraIndex = $rowIndex;
+                        $curStudent['Rate'] += $curRate['Rate'];
+                        $rateExtra += $curRate['Rate'];
                     } else {
-                        $curStudent['Rates'][$rowIndex]['Block'] = 'True';
+                        if ($firstEmptyExtra < 0) {
+                            $firstEmptyExtra = $rowIndex;
+                        } else {
+                            $curStudent['Rates'][$rowIndex]['Block'] = 'True';
+                        }
                     }
-                }
-                break;
-            default:
-                    throw HTTP_Exception::factory (500, "Некорректный тип модуля!");
+                    break;
+                default:
+                    throw HTTP_Exception::factory(500, "Некорректный тип модуля!");
             }
             $rowIndex++;
         }
-        
-//        $total = $this->model_rating->GetStudentRate($curStudent['ID'], $disciplineID);
+
+//        $total = Model_Rating->GetStudentRate($curStudent['ID'], $disciplineID);
 //        $total = ($total[0])?$total[0]['Num']:0;
 //        if ($total)
 //            $total = 0;
@@ -235,88 +212,67 @@ class Controller_Teacher_Rating extends Controller_UserEnvironment {
         }
         $this->correctExtra($curStudent, $examType, $lastExtraIndex, $firstEmptyExtra, $rateExtra);
     }
-	
-	protected function get_edit_rights_for_teacher($teacherID, $disciplineID) // $this->user['TeacherID']=id
-	{
-		$sql = "SELECT `GetEditRightsForTeacher`('$teacherID', '$disciplineID') AS `Num`;";//"CALL `GetEditRightsForTeacher`('$teacherID', '$disciplineID'); ";
-        $res = DB::query(Database::SELECT, $sql)->execute();
-		//$row = mysql_fetch_array($res);
-		return $res['Num'];
-	}
-    
-    protected function stub_action($page_type) //$page_type: rating, exam
-    {
-        $twig = Twig::factory("teacher/".$page_type); //TODO: validate twig 
-        $disciplineId = $this->request->param('id');
-        $disciplineInfo = $this->getDisciplineInformation($disciplineId);
-		$disciplineInfo['LocalizedExamType'] = DataHelper::LocalizeExamType($disciplineInfo['ExamType']);
-	    $structureHandled = $this->getStructure($disciplineId, $page_type);
-        
+
+    /**
+     * @param $page_type : rating, exam
+     * @throws HTTP_Exception
+     */
+    protected function action_rate() {
+        $id = $this->request->param('id');
+        $pageType = $this->request->param('type');
+
+        $discipline = Model_Discipline::load($id);
+        $discipline['GroupID_Filter'] = $this->getFilterGroupID($id);
+        $discipline['LocalizedExamType'] = RusLang::tr($discipline->Type);
+
         // Студенты и их баллы
-        $students = $this->model_rating->GetStudentsForRating($disciplineId);
+        $students = Model_Rating::GetStudentsForRating($id);
 
+        $rateHandled = [];
+        $groupsHandled = [];
+        $groupInd = $studentInd = $curGroupID = 0;
 
-        $rateHandled = array();
-        $groupsHandled = array();
-        $i_g = $i_s = $curGroup = 0;
+        foreach ($students as $row) {
 
-        foreach($students as $row) {
-            
-            if ($curGroup !== $row['GroupID']) {
-                $curGroup = $row['GroupID'];
-                $i_g++;
-                $i_s = 0;
-                $rateHandled[$i_g] = $this->processGroupInfo($row);
-                $groupsHandled[$curGroup] = $rateHandled[$i_g]['GroupTitle'];
+            if ($curGroupID !== $row['GroupID']) {
+                $curGroupID = $row['GroupID'];
+                $groupInd++;
+                $studentInd = 0;
+                $rateHandled[$groupInd] = $this->processGroupInfo($row);
+                $groupsHandled[$curGroupID] = $rateHandled[$groupInd]['GroupTitle'];
             }
-            
+
             // Студенты
             $curStudent = $row; //ID, Name, isAttached
             $curStudent['RateResult'] = 0;
-            
+
             // Баллы студента
-            if ($page_type == "rating") {
-                $rates_raw = Model_Rating::getRates($disciplineId, $row['ID']);
+            if ($pageType == 'rate') {
+                $rates_raw = Model_Rating::getRates($id, $row['ID']);
                 $rates = $this->getRatesForRatingPage($rates_raw);
                 $curStudent['RateResult'] = $rates['RateResult'];
                 unset($rates['RateResult']);
                 $curStudent['Rates'] = $rates;
-                $rateHandled[$i_g]['Students'][$i_s] = $curStudent;
-                
+                $rateHandled[$groupInd]['Students'][$studentInd] = $curStudent;
             } else {
-                $rate = Model_Rating::getExamRates($disciplineId, $row['ID']);
-                $this->getRatesForExamPage($curStudent, $rate, $disciplineInfo['ExamType'], $disciplineId);
-                $rateHandled[$i_g]['Students'][$i_s] = $curStudent;
+                $rate = Model_Rating::getExamRates($id, $row['ID']);
+                $this->getRatesForExamPage($curStudent, $rate, $discipline->Type, $id);
+                $rateHandled[$groupInd]['Students'][$studentInd] = $curStudent;
             }
-            $i_s++;
+            $studentInd++;
         }
-        
-		$editRights=$this->get_edit_rights_for_teacher($this->user['TeacherID'], $disciplineInfo['ID']);
-        if($editRights == 1)
-			$twig->editRights=$editRights;
-		else
-			$twig->editRights=0;
-			
-		// На вывод
-        $twig->User = $this->user;
-        $twig->headerRate = $structureHandled; // Шапка таблицы: структура УКД (модули и мероприятия)
-        $twig->rateTable = $rateHandled;
-        $twig->groups = $groupsHandled;
-        $twig->disciplineInfo = $disciplineInfo;
-        $twig->disciplineInfo_JSON = json_encode($twig->disciplineInfo);
-        $this->response->body($twig);
-    }
 
-    
-    
-    // Страница оценивания в течение семестра
-    public function action_edit() {
-        $this->stub_action("rating");
+        $twigType = ($pageType == 'rate') ? 'rating' : $pageType;
+        // Шапка таблицы: структура УКД (модули и мероприятия)
+        $this->twig->set([
+            'groups'          => $groupsHandled,
+            'rateTable'       => $rateHandled,
+            'headerRate'      => $this->getStructure($id, $pageType),
+            'Discipline'      => $discipline,
+            'Discipline_JSON' => json_encode($discipline),
+        ])->set_filename("teacher/" . $twigType);
     }
 
-    // Страница оценивания в сессию
-    public function action_exam() {
-        $this->stub_action("exam");
-    }
+
 }
             
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Controller/UserEnvironment.php b/~dev_rating/application/classes/Controller/UserEnvironment.php
deleted file mode 100644
index 15a36c660648f079f5adfa6513454aab0f27b0df..0000000000000000000000000000000000000000
--- a/~dev_rating/application/classes/Controller/UserEnvironment.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-
-class Controller_UserEnvironment extends Controller
-{
-    protected $SemesterInfo;
-
-    /** @var User */
-    protected $user;
-
-    public function before() {
-        $this->user = User::instance();
-        if (!$this->user->isSignedIn()) {
-            $this->redirect('sign', 302);
-            return;
-        }
-
-        $semester = Model_Semesters::getInfo($this->user->SemesterID);
-        // $semester['Num'] = $semester['Num'] == 1 ? 'Осень' : 'Весна';
-        if ($semester['Num'] == 1) {
-            $semester['Num'] = 'Осень';
-        } else {
-            $semester['Num'] = 'Весна';
-            $semester['Year']++;
-        }
-        $this->SemesterInfo = $semester;
-
-        if ($this->user->Type == 'student') {
-            //unified degree from db
-            $uniDegree = $this->user['Degree'];
-            $this->user['Degree'] = Model_Grades::getDegreeTitle($uniDegree);
-        }
-        // Проверка на доступ к странице
-        $route = Route::name($this->request->route());
-        $userMark = $this->user->RoleMark;
-        $sysModel = new Model_System;
-        $bitmask = (int)$sysModel->getBitmaskForRoute($route);
-        if ($bitmask === 0) {
-            $bitmask = (int)1;
-        }
-        if ($userMark === 0) {
-            $userMark = (int)1;
-        }
-        if (!($bitmask & $userMark)) {
-            throw HTTP_Exception::factory(403, 'Не пытайтесь попасть туда, куда попадать не следует.');
-        }
-    }
-
-    public function action_index() {
-        $type = $this->user->Type;
-        $page = Request::factory($type . '/index')->execute();
-        $this->response->body($page);
-    }
-
-    public function action_profile() {
-        if ($this->user->Type != 'teacher') {
-            $this->redirect('/', 302);
-        } else {
-            $url = "teacher/profile";
-            $page = Request::factory($url)->execute();
-            $this->response->body($page);
-        }
-    }
-
-    public function action_settings() {
-        $page = Request::factory($this->user->Type . '/settings')->execute();
-        $this->response->body($page);
-    }
-}
diff --git a/~dev_rating/application/classes/DataHelper.php b/~dev_rating/application/classes/DataHelper.php
deleted file mode 100644
index 039c7c4d5b3a258f61c3927e73df9dff81f44985..0000000000000000000000000000000000000000
--- a/~dev_rating/application/classes/DataHelper.php
+++ /dev/null
@@ -1,91 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-
-class DataHelper
-{
-    // take array with (at least) LastName & FirstName keys
-    static public function AbbreviateName(&$personInfo) {
-        $fullName = $personInfo['LastName'].' '.UTF8::substr($personInfo['FirstName'], 0, 1).'. ';
-        if(!empty($personInfo['SecondName'])) {
-            $fullName .= UTF8::substr($personInfo['SecondName'], 0, 1).'.';
-        }
-        return $fullName;
-    }
-
-    static public function GetAbbrNameArray($persons)
-    {
-        $result = array();
-        $i = 0;
-        foreach ($persons as $person){
-            $result[$i] = self::AbbreviateName($person);
-            ++$i;
-        }
-        return $result;
-    }
-
-    static public function LocalizeExamType($examType) {
-		$res = "";
-		switch($examType) {
-			case "exam" : $res = "Экзамен"; break;
-			case "credit" : $res = "Зачет"; break;
-			case "grading_credit" : $res = "Дифф. зачет"; break;
-		}
-        return $res;
-    }
-
-    static public function LocalizeDegree($degree) {
-        return Model_Grades::getDegreeTitle($degree);
-    }
-
-    static public function DeserializeDisciplines($rawDiscs)
-    {
-        $subjID = $discID = $gradeID = $i = $j = 0; // Combo!!!
-        $result = array();
-
-        foreach ($rawDiscs as $row)
-        {
-            $curSubjectID = $row['SubjectID'];
-            $curGradeID = $row['GradeID'];
-            $curDiscID =  $row['ID'];
-
-            if($subjID != $curSubjectID || $gradeID != $curGradeID)
-            {
-                $j = 0;
-                ++$i;
-                $subjID = $curSubjectID;
-                $gradeID = $curGradeID;
-
-                // new grade/subject
-                $data = array();
-                $data['Degree'] = $row['Degree'];
-                $data['GradeNum'] = $row['GradeNum'];
-                $data['SubjectName'] = $row['SubjectName'];
-                $result[$i] = $data;
-                $result[$i]['Disciplines'] = array();
-                $discs = &$result[$i]['Disciplines'];
-            }
-
-            if($discID != $curDiscID)
-            {
-                $discID = $curDiscID;
-                $discs[$j] = $row; // IsAuthor, IsLocked, IsMapCreated, ID, ExamType
-                ++$j;
-            }
-        } //!for_each
-
-        return $result;
-    }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Error.php b/~dev_rating/application/classes/Error.php
new file mode 100644
index 0000000000000000000000000000000000000000..aa08825f129a0776c512e535a071fef5ddb3c9c3
--- /dev/null
+++ b/~dev_rating/application/classes/Error.php
@@ -0,0 +1,8 @@
+<?php defined('SYSPATH') or die('No direct script access.');
+
+class Error {
+    const ID_IS_INCORRECT      = 'id is incorrect';
+    const ACCESS_DENIED       = 'access denied';
+    const DISCIPLINE_IS_LOCKED = 'discipline is locked';
+    const DISCIPLINE_NOT_FOUND = 'discipline does not exist';
+}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/FileParser.php b/~dev_rating/application/classes/FileParser.php
index 775075edfee8663807d94211dfc50487687f5d79..3c472500f2b670f73a16559efc9ad9152cc774c0 100644
--- a/~dev_rating/application/classes/FileParser.php
+++ b/~dev_rating/application/classes/FileParser.php
@@ -2,116 +2,125 @@
 
 class FileParser
 {
-    public static function StudentsList($filename, $facultyID)
-    {
-        if(File::mime($filename) != 'text/plain')
-            return true;
-        $file = fopen($filename, "r"); 
-        $i = $j = 0; $resultArr = array();
-        while ($line = fgetcsv($file, 0, ";")) 
-        {
-            // Имя, фамилия, отчество
-            list($lastName, $firstName, $secondName) = self::parsePeopleName($line[0]);
-            // Курс, степень подготовки
-            $studentGradeNum = $line[1];
-            $studentGroupNum = $line[2];
-            $studentDegree = Model_Grades::getDegreeType($line[3]);
-            $studentSpec = $line[4];
-            $attempt = Account::instance()->createStudentEx($lastName, $firstName, $secondName, 
-                                                $studentGradeNum, $studentGroupNum, $studentDegree, $studentSpec, $facultyID);
-            if($attempt == -1)
-            {
-                $resultArr[$j]['Row'] = $i;
-                $resultArr[$j]['Info'] = implode(';', $line);
-                $j++;
+    /**
+     * Parse students' info & synchronize it with database.
+     * @param $filename string File with source data
+     * @param $facultyID int
+     * @return array errors
+     */
+    public static function uploadStudents($filename, $facultyID) {
+        if (File::mime($filename) != 'text/plain')
+            return [];
+
+        $file = fopen($filename, "r");
+
+        $i = 0;
+        $errors = [];
+
+        while ($line = fgetcsv($file, 0, ";")) {
+            // ФИО, курс, степень подготовки,
+            list($name, $gradeNum, $groupNum, $degree, $spec) = UTF8::clear($line);
+
+            // Фамилия, имя, отчество
+            list($lastName, $firstName, $secondName) = self::parseFullName($name);
+
+            $degree = Model_Grades::getDegreeType($degree);
+
+            $attempt = Model_Account::createStudentEx(
+                $lastName, $firstName, $secondName, $gradeNum, $groupNum, $degree, $spec, $facultyID
+            );
+
+            if ($attempt == -1) {
+                $errors[] = ['Row' => $i, 'Info' => implode(';', $line)];
             }
+
             $i++;
         }
-        return ($j > 0) ? false : $resultArr;
+
+        return $errors;
     }
 
-    public static function SubjectsList($filename, $facultyID)
-    {
-        $resultArr = array();
-        $resultArr['Success'] = false;
-        $model = new Model_Students();
-        if(File::mime($filename) != 'text/plain')
-            return $resultArr;
-        $file = fopen($filename, "r"); 
-        $i = $errorsCount = $exists = 0;
-        while ($line = fgetcsv($file, 0, ";")) 
-        {
-            $attempt = Account::instance()->createSubject($line[0], $line[1], $facultyID);
-            if((int)$attempt < 0)
-            {
-                $resultArr['Errors'][$errorsCount]['Row'] = $i;
-                $resultArr['Errors'][$errorsCount]['Info'] = implode(';', $line);
-                $errorsCount++;
+    /**
+     * Parse subjects' info & synchronize it with database.
+     * @param $filename  string File with source data
+     * @param $facultyID int
+     * @return array
+     */
+    public static function uploadSubjects($filename, $facultyID) {
+        if (File::mime($filename) != 'text/plain')
+            return [];
+
+        $file = fopen($filename, "r");
+        $count = $exists = 0;
+        $errors = [];
+
+        while ($line = fgetcsv($file, 0, ";")) {
+            list($name, $abbr) = UTF8::clear($line);
+            $attempt = Model_Subject::create($name, $abbr, $facultyID);
+
+            if ($attempt < 0) {
+                $errors[] = ['Row' => $count, 'Info' => implode(';', $line)];
+            } elseif ($attempt == 1) {
+                $exists++;
             }
-            else
-                if ((int)$attempt == 1)
-                    $exists++;
-            $i++;
+
+            $count++;
         }
 
-        $resultArr['Success'] = true;
-        $resultArr['ErrorsCount'] = $errorsCount;
-        $resultArr['RecordsExistsCount'] = $exists;
-        $resultArr['RecordsCount'] = $i;
-        return $resultArr;
+        return [
+            'Errors'             => $errors,
+            'ErrorsCount'        => count($errors),
+            'RecordsCount'       => $count,
+            'RecordsExistsCount' => $exists,
+        ];
     }
-    
-    public static function TeachersList($filename)
-    {
-        // get faculties list
-        $model = new Model_Admin_Teachers;
-        $dbFaculties = $model->getFaculties();
-        foreach ($dbFaculties as $rec) {
-            $name = trim($rec['Name']);
-            $id = $rec['ID'];
-            $faculties[$name] = $id;
-        }
 
-        if(File::mime($filename) != 'text/plain')
-            return true;
+
+    /**
+     * Parse teachers' info & synchronize it with database.
+     * @param $filename  string File with source data
+     * @param $facultyID int
+     * @return array
+     */
+    public static function uploadTeachers($filename, $facultyID) {
+        if (File::mime($filename) != 'text/plain')
+            return [];
+
+//        $faculties = [];
+//        foreach (Model_Faculties::load() as $faculty) {
+//            $name = trim($faculty['Name']);
+//            $faculties[$name] = $faculty['ID'];
+//        }
+
+        $count = 0;
+        $errors = [];
         $file = fopen($filename, "r");
-        $i = $j = 0;
-        while ($line = fgetcsv($file, 0, ";")) 
-        {
-            // Имя, фамилия, отчество
-            list($lastName, $firstName, $secondName) = self::parsePeopleName($line[0]);
-            $departmentName = $line[1];
-            $facultyID = 6;  // TODO fix facultyID hardcode
-            if ($line[2])
-                $facultyID = $faculties[trim($line[2])];
-            $attempt = Account::instance()->createTeacherByDepName($lastName, $firstName, $secondName, 
-                                                $departmentName, $facultyID); // TODO fix facultyID hardcode
-            if($attempt == -1)
-            {
-                $resultArr[$j]['Row'] = $i;
-                $resultArr[$j]['Info'] = implode(';', $line);
-                $j++;
+
+        while ($line = fgetcsv($file, 0, ";")) {
+            list($name, $department, $facultyName) = UTF8::clear($line);
+
+            // Фамилия, имя, отчество
+            list($lastName, $firstName, $secondName) = self::parseFullName($name);
+
+//            if ($facultyName)
+//                $facultyID = $faculties[trim($facultyName)];
+
+            $attempt = Model_Account::createTeacherByDepName($lastName, $firstName, $secondName, $department, $facultyID);
+
+            if ($attempt == -1) {
+                $errors[] = ['Row' => $count, 'Info' => implode(';', $line)];
             }
-            $i++;
+
+            $count++;
         }
-        return ($j > 0) ? false : $resultArr;
+
+        return $errors;
     }
-    
-    protected static function parsePeopleName($name)
-    {
-        $nameExploded = explode(' ', $name); 
-        $idx = 0; $nameHandled = array();
-        if(UTF8::substr($nameExploded[1], 0, 1) == '(')
-        {
-            $idx = 1;
-        }
-        $nameHandled[0] = $nameExploded[0];
-        $nameHandled[1] = $nameExploded[1 + $idx];
-        $nameHandled[2] = '';
-        for($i = 2 + $idx; $i < count($nameExploded); $i++)
-        {
-            $nameHandled[2] .= $nameExploded[$i].' ';
-        }
-        return Arr::map('trim', $nameHandled);
+
+    private static function parseFullName($name) {
+        // Енотова (Сенченко) Наталья Лин Чу Геннадьевна
+        $name = preg_replace('/\(.*\)\s+/', '', $name);
+        $res = explode(' ', $name, 3);
+        return Arr::map('trim', $res);
     }
 }
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Model/Account.php b/~dev_rating/application/classes/Model/Account.php
new file mode 100644
index 0000000000000000000000000000000000000000..afa79bba54a167ec0d8ace81276a233e9e013db5
--- /dev/null
+++ b/~dev_rating/application/classes/Model/Account.php
@@ -0,0 +1,215 @@
+<?php defined('SYSPATH') or die('No direct script access.');
+
+class Model_Account extends Model
+{
+    public static function setHashKey($key) {
+        # TODO: not implemented
+    }
+
+    public static function getMaintenanceInfo() {
+        $config = Model_System::loadConfig("general.json");
+
+        $result['active'] = $config->Maintenance->active;
+        $result['return'] = $config->Maintenance->return;
+        return $result;
+    }
+
+    public static function checkAuth($login, $password) {
+        $sql = "SELECT `SignIn`(:login, :pass) AS `ID`;";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':login', $login)
+            ->param(':pass', $password)
+            ->execute()->get('ID');
+    }
+
+
+    private static function generateActivationCode() {
+        $activationCode = Text::random('ABDCEFGHJKLMNPQRSTUVWXYZ123456789', 10);
+        return UTF8::strtoupper($activationCode);
+    }
+
+    public static function createTeacher($lastName, $firstName, $secondName, $degreeID, $departmentID) {
+        $code = self::generateActivationCode();
+
+        $sql = "SELECT `CreateTeacher`(:last, :first, :second, :degree, :department, :code) AS `teacherID`";
+        $response = DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':last'       => $lastName,
+                ':first'      => $firstName,
+                ':second'     => $secondName,
+                ':degree'     => $degreeID,
+                ':department' => $departmentID,
+                ':code'       => $code,
+            ])->execute()->get('teacherID');
+
+        return $response == -1 ? -1 : $code;
+    }
+
+    public static function createTeacherByDepName($lastName, $firstName, $secondName, $department, $facultyID) {
+        if ($department == '') return -1;
+
+        $code = self::generateActivationCode();
+
+        $sql = "SELECT `CreateTeacherByDepName`(:last, :first, :second, :department, :faculty, :code) AS `UserID`;";
+        $response = DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':last'       => trim($lastName),
+                ':first'      => trim($firstName),
+                ':second'     => trim($secondName),
+                ':department' => $department,
+                ':faculty'    => $facultyID,
+                ':code'       => $code,
+            ])->execute()->get('UserID');
+
+        return $response == -1 ? -1 : $code;
+    }
+
+    public static function createStudent($lastName, $firstName, $secondName, $grade, $groupNum, $facultyID, $semesterID = null) {
+        $code = self::generateActivationCode();
+
+        if (!$semesterID) $semesterID = Model_System::$SemesterID;
+
+        $sql = "SELECT `CreateStudent`(:last, :first, :second, :grade, :group, :faculty, :code, :semester) AS `UserID`";
+
+        $response = DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':last'     => trim($lastName),
+                ':first'    => trim($firstName),
+                ':second'   => trim($secondName),
+                ':grade'    => $grade,
+                ':group'    => $groupNum,
+                ':faculty'  => $facultyID,
+                ':code'     => $code,
+                ':semester' => $semesterID
+            ])->execute()->get('UserID');
+
+        return $response == -1 ? -1 : $code;
+    }
+
+    public static function createStudentEx($lastName, $firstName, $secondName, $gradeNum, $groupNum, $degree, $specialization, $facultyID, $semesterID = null) {
+        $code = self::generateActivationCode();
+
+        if (!$semesterID) $semesterID = Model_System::$SemesterID;
+
+        $sql = "SELECT `CreateStudentEx`(:last, :first, :second, :grade, :group, :degree, :spec, :faculty, :code, :semester) AS `UserID`;";
+        $response = DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':last'     => trim($lastName),
+                ':first'    => trim($firstName),
+                ':second'   => trim($secondName),
+                ':grade'    => $gradeNum,
+                ':group'    => $groupNum,
+                ':degree'   => $degree,
+                ':spec'     => $specialization,
+                ':faculty'  => $facultyID,
+                ':code'     => $code,
+                ':semester' => $semesterID
+            ])->execute()->get('UserID');
+
+        return $response == -1 ? -1 : $code;
+    }
+
+
+    public static function getUserInfo($id, $semesterID = null) {
+        $semesterID = $semesterID ? $semesterID : User::instance()->SemesterID;
+        $sql = "CALL `GetFullInfo`(:id, :semester);";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':id', (int) $id)
+            ->param(':semester', (int) $semesterID)
+            ->execute()[0];
+    }
+
+
+    # TODO: deprecated (see getUserInfo)
+    public static function getPersonalInfo($id, $semesterID = null) {
+        $semesterID = $semesterID ? $semesterID : User::instance()->SemesterID;
+        $sql = "CALL `GetPersonalInfo`(:id, :semester);";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':semester', (int) $semesterID)
+            ->param(':id', (int) $id)
+            ->execute()[0];
+    }
+
+    # TODO: deprecated (see getUserInfo)
+    public static function getAccountInfo($id) {
+        return DB::query(Database::SELECT, "CALL GetAccountInfo(:id);")
+            ->param(':id', (int) $id)->execute()[0];
+    }
+
+    /**
+     * @param int    $id
+     * @param string $value
+     * @param string $type 'email', 'login' or 'password'
+     * @return int
+     */
+    public static function changeAccountData($id, $value, $type) {
+        $sql = "SELECT `ChangeAccountData`(:account, :value, :type) AS Num;";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':account' => $id,
+                ':value'   => $value,
+                ':type'    => $type,
+            ])->execute()->get('Num');
+    }
+
+    /**
+     * @param string $data
+     * @param string $type 'login','email' or 'code'
+     * @return int
+     */
+    public static function checkAccountExistence($data, $type) {
+        $sql = "SELECT `CheckAccountExistence`(:data, :type) AS Num;";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':data', $data)
+            ->param(':type', $type)
+            ->execute()->get('Num');
+    }
+
+    public static function isActivationCodeValid($code) {
+        $sql = "SELECT `CheckAccountExistence`(:acode, 'code') AS Num;";
+        $res = DB::query(Database::SELECT, $sql)
+            ->param(':acode', $code)
+            ->execute()->get('Num');
+        return $res == 1;
+    }
+
+    public static function createRecoveryToken($email, $token) {
+        $sql = "SELECT `CreateRecoveryToken`(:email, :token) AS UserName;";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':email', $email)
+            ->param(':token', $token)
+            ->execute()->get('UserName');
+    }
+
+    public static function getRecoveryInfoByEMail($email) {
+        $sql = "CALL GetRecoveryInfoByEMail(:email);";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':email', $email)
+            ->execute();
+    }
+
+    public static function getRecoveryInfoByToken($token) {
+        $sql = "CALL GetRecoveryInfoByToken(:token);";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':token', $token)->execute();
+    }
+
+    public static function useRecoveryToken($token) {
+        $sql = "SELECT `UseRecoveryToken`(:token) AS Num;";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':token', $token)
+            ->execute()->get('Num');
+    }
+
+    public static function activateAccount($login, $password, $email, $code) {
+        $sql = "SELECT `ActivateAccount`(:code, :login, :email, :pass) AS `Num`;";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':code'  => $code,
+                ':login' => $login,
+                ':email' => $email,
+                ':pass'  => $password,
+            ])->execute()->get('Num');
+    }
+
+}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Model/Accounts.php b/~dev_rating/application/classes/Model/Accounts.php
deleted file mode 100644
index b59747db18d971f9cb792dc0020f3ea404244693..0000000000000000000000000000000000000000
--- a/~dev_rating/application/classes/Model/Accounts.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-
-class Model_Accounts extends Model
-{
-    public static function getAccountInfo($ID) {
-        $sql = "CALL `GetAccountInfo`('$ID'); ";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Model/Container.php b/~dev_rating/application/classes/Model/Container.php
new file mode 100644
index 0000000000000000000000000000000000000000..2c16482cec288d9046eb0103a76f9e1af157cbea
--- /dev/null
+++ b/~dev_rating/application/classes/Model/Container.php
@@ -0,0 +1,153 @@
+<?php defined('SYSPATH') or die('No direct script access.');
+
+/**
+ * @property-read $ID int
+ */
+abstract class Model_Container extends Model implements JsonSerializable, ArrayAccess
+{
+    /**
+     * A case-sensitive string for ID field.
+     * The field must exist in every container.
+     * @var string
+     */
+    protected static $ID_FIELD = 'ID';
+
+    /**
+     * A flag for builders to create new instances in db.
+     * Used in Helper/Builder.php
+     */
+    private static $CREATE_FLAG = '__CREATE__!@#$%^&;';
+
+
+    protected $data;
+
+    /**
+     * @var bool
+     * Indicates whether data was loaded from db.
+     */
+    protected $loaded = false;
+
+    /**
+     * @var bool
+     * Allow to load data from database, if current
+     * object instance does not contains some fields.
+     */
+    protected $lazy = true;
+
+    /**
+     * @param $data        array
+     *                     Source data for building the object.
+     * @param $associated  bool
+     *                     Indicates whether object exists in db.
+     * @param $lazyLoading bool
+     *                     Indicates whether lazy loading can be used.
+     */
+    public function __construct(array & $data, $associated = true, $lazyLoading = true) {
+        $this->data = $data;
+        $this->lazy = $lazyLoading;
+
+        if (!$associated && $data[self::$CREATE_FLAG]) {
+            unset($this->data[self::$CREATE_FLAG]);
+            $this->create();
+        }
+
+        if (!isset($this->data[self::$ID_FIELD]))
+            throw new LogicException(Error::ID_IS_INCORRECT);
+    }
+
+    /**
+     * Creation of new object from raw data.
+     */
+    static public function make() { }
+
+    /**
+     * Load the object from database.
+     * @param $id int  object id
+     * @return $this  new instance
+     */
+    static public function load($id) {
+        if (!is_numeric($id) || $id <= 0)
+            throw new InvalidArgumentException(Error::ID_IS_INCORRECT);
+
+        // lazy loading
+        $data[self::$ID_FIELD] = (int) $id;
+        return new static($data, true);
+    }
+
+    /**
+     * Create new object in db, based on $data.
+     */
+    protected abstract function create();
+
+    public function __get($name) {
+        // if value has already been loaded
+        if (array_key_exists($name, $this->data))
+            return $this->data[$name];
+
+        // if no, then make query to db
+        $this->loadData();
+        if (array_key_exists($name, $this->data))
+            return $this->data[$name];
+
+        throw new ErrorException('No such field or property');
+    }
+
+    public function __isset($name) {
+        return array_key_exists($name, $this->data);
+    }
+
+    public function __set($name, $value) {
+        if ($name == self::$ID_FIELD)
+            throw new BadMethodCallException();
+        $this->data[$name] = $value;
+    }
+
+    // todo: remove this one
+    public function offsetExists($name) {
+        $name = ucfirst($name);
+
+        if (array_key_exists($name, $this->data))
+            return true;
+
+        $this->loadData();
+        return array_key_exists($name, $this->data);
+    }
+
+    public function offsetGet($offset) {
+        return $this->__get($offset);
+    }
+
+    public function offsetSet($offset, $value) {
+        $this->__set($offset, $value);
+    }
+
+    public function offsetUnset($offset) {
+        throw new BadMethodCallException();
+        // this method may be confused by lazy loading
+    }
+
+    /** @deprecated */
+    public function toArray() {
+        $this->loadData();
+        return $this->data;
+    }
+
+    public function jsonSerialize($forceLoad = true) {
+        if ($forceLoad)
+            $this->loadData();
+        return $this->data;
+    }
+
+    protected function loadData() {
+        if (!$this->loaded && $this->lazy) {
+            $this->data = array_merge($this->data, static::getInfo($this->ID));
+            $this->loaded = true;
+        }
+    }
+
+    /**
+     * @param $id int object id
+     * @return array data from database
+     */
+    protected abstract function getInfo($id);
+}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Model/CourseWork.php b/~dev_rating/application/classes/Model/CourseWork.php
index d31df21b00f3c12e5ed90b214706f3ec012ceb98..9acc8e96843fb05a64cdf83c1a0c9f8bd976dfe0 100644
--- a/~dev_rating/application/classes/Model/CourseWork.php
+++ b/~dev_rating/application/classes/Model/CourseWork.php
@@ -1,33 +1,27 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Model_CourseWork extends Model {
+/**
+ * @property-read $ID          int
+ * @property      $AuthorID    int
+ * @property      $GradeID     int
+ * @property      $GradeNum    int
+ * @property      $FacultyID   int
+ * @property      $FacultyName string
+ * @property      $Degree      string  bachelor / master
+ * @property      $SemesterID  int
+ * @property      $Type        string
+ * @property      $Subtype     string  Either "scientific" or "disciplinary"
+ * @property      $IsLocked    bool
+ * @property      $IsBonus     bool
+ * @property      $Milestone   mixed
+ */
+class Model_CourseWork extends Model_Discipline
+{
+    const SCIENTIFIC = 'scientific_coursework';
+    const DISCIPLINARY = 'disciplinary_coursework';
 
-    /**
-     * Add new discipline.
-     *
-     * @param $data
-     * <li>teacher int teacher id</li>
-     * <li>grade int 1-7</li>
-     * <li>subject int subject id</li>
-     * <li>type string <tt>scientific</tt> or <tt>disciplinary</tt></li>
-     * <li>faculty int faculty id</li>
-     * @return int  discipline id
-     */
-    public static function create(array $data) {
-        $map = [
-            'scientific' => 'scientific_coursework',
-            'disciplinary' => 'disciplinary_coursework',
-        ];
-
-        $sql = "SELECT `AddDiscipline`(:teacher, :grade, :subject, 'grading_credit', 0, 0, 0, :faculty, :type) AS `Num`;";
-
-        return $result = DB::query(Database::SELECT, $sql)
-            ->parameters([
-                ':teacher' => $data['teacher'],
-                ':subject' => $data['subject'],
-                ':faculty' => $data['faculty'],
-                ':grade' => $data['grade'],
-                ':type' => $map[$data['type']],
-            ])->execute()[0]['Num'];
+    /** Creation of new course work from raw data. */
+    public static function make() {
+        return new Model_Helper_CourseWorkBuilder();
     }
 }
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Model/Departments.php b/~dev_rating/application/classes/Model/Departments.php
index ab19cba96bc684a547bdcdaaea4d72de9090eb64..83f3a8e2f589d5652206536a85259ecf25b0d930 100644
--- a/~dev_rating/application/classes/Model/Departments.php
+++ b/~dev_rating/application/classes/Model/Departments.php
@@ -6,13 +6,14 @@ class Model_Departments extends Model
      * @param $faculty int faculty id
      * @return Database_Result
      */
-    public static function ofFaculty($faculty) {
-        $sql = "CALL `GetDepartments`('$faculty'); ";
-        return DB::query(Database::SELECT, $sql)->execute();
+    public static function ofFaculty($faculty) {        // todo: move to Model_Faculty
+        $sql = "CALL `GetDepartments`(:faculty)";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':faculty', $faculty)->execute();
     }
 
-    public static function byFaculty($facultyID) {
-        $list = array();
+    public static function byFaculty($facultyID) {      // fixme: how this differs with ofFaculty method?
+        $list = [];
         if ($facultyID > 0) {
             $departments = self::ofFaculty($facultyID);
             foreach ($departments as $row) {
diff --git a/~dev_rating/application/classes/Model/Discipline.php b/~dev_rating/application/classes/Model/Discipline.php
index bef418f9583ac8375773a6fd107b23244ed880e8..4ad398dabfd0d4f90b49c6c9048f466d58cdef06 100644
--- a/~dev_rating/application/classes/Model/Discipline.php
+++ b/~dev_rating/application/classes/Model/Discipline.php
@@ -1,95 +1,177 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Model_Discipline extends Model
+/**
+ * @property-read $ID          int
+ * @property      $AuthorID    int
+ * @property      $GradeID     int
+ * @property      $GradeNum    int
+ * @property      $FacultyID   int
+ * @property      $FacultyName string
+ * @property      $Degree      string  bachelor / master
+ * @property      $SubjectID   int
+ * @property      $SubjectName string
+ * @property      $SubjectAbbr string
+ * @property      $SemesterID  int
+ * @property      $Lectures    int
+ * @property      $Practice    int
+ * @property      $Labs        int
+ * @property      $Type        string
+ * @property      $Subtype     string
+ * @property      $IsLocked    bool
+ * @property      $IsBonus     bool
+ * @ property $Milestone mixed todo param is missing
+ */
+class Model_Discipline extends Model_Container
 {
     /**
      * @param $id int discipline id
      * @return array data from <tt>view_disciplines</tt> table
      * @throws HTTP_Exception if discipline does not exist
      */
-    public static function getInfo($id) {
-        $sql = "CALL `GetDisciplineInfo`('$id'); ";
-        $info = DB::query(Database::SELECT, $sql)->execute();
+    protected function getInfo($id) {
+        $sql = "CALL `Discipline_GetInfo`(:id)";
+        $info = DB::query(Database::SELECT, $sql)
+            ->param(':id', $id)->execute();
 
-        if($info->count() == 0)
-            throw HTTP_Exception::factory(404, "Учебная карта дисциплины с ID $id не найдена!");
+        if ($info->count() == 0)
+            throw new InvalidArgumentException(Error::DISCIPLINE_NOT_FOUND);
         return $info->offsetGet(0);
     }
 
+    /**
+     * Creation of new discipline from raw data.
+     * @return Model_Helper_DisciplineBuilder
+     */
+    static public function make() {
+        return new Model_Helper_DisciplineBuilder();
+    }
 
     /**
-     * Add new discipline.
-     *
-     * @param $teacher int teacher id
-     * @param $grade int 1-7
-     * @param $subject int subject id
-     * @param $examType string <tt>exam</tt> or <tt>credit</tt>
-     * @param $lectureCount int
-     * @param $practiceCount int
-     * @param $labCount int
-     * @param $department int department id
-     * @return Database_Result
+     * Create new discipline in db, based on $data.
      */
-    public static function create($teacher, $grade, $subject, $examType, $lectureCount, $practiceCount, $labCount, $department) {
-        $sql = "SELECT `AddDiscipline`('$teacher', '$grade', '$subject', '$examType', '$lectureCount', '$practiceCount', '$labCount', '$department', NULL) AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
+    protected function create() {
+        $sql = "SELECT `Discipline_Create`(AuthorID, GradeID, SubjectID, Type, Lectures, Practice, Labs, FacultyID, SemesterID, Subtype) AS `Num`;";
+
+        $this->data[self::$ID_FIELD] = DB::query(Database::SELECT, $sql)
+            ->parameters($this->data)
+            ->execute()[0]['Num'];
     }
 
-    /** Change grade. */
-    public static function changeGrade($DisciplineID, $teacherID, $Grade) {
-        $sql = "SELECT `ChangeDisciplineGrade`('$teacherID', '$DisciplineID', '$Grade') AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
+    public function delete() {
+        $sql = "SELECT `Discipline_Delete`(:id);";
+        DB::query(Database::SELECT, $sql)->param(':id', $this->ID)->execute();
+    }
+
+    // todo: should return Model_Group[]
+    public function getGroups() {
+        $sql = "CALL `GetGroupsForDiscipline`(:id);";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':id', $this->ID)
+            ->execute()->as_array();
+    }
+
+    // todo: should return Model_Teacher[]
+    public function getTeachers() {
+        $sql = "CALL `GetTeachersForDiscipline`(:id)";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':id', $this->ID)->execute();
+    }
+
+    public function bind(Model_Teacher $teacher) {
+        if ($this->ID == $teacher->ID)
+            return;
+
+        $sql = "SELECT `Discipline_BindTeacher`(:id, :teacher)";
+        DB::query(Database::SELECT, $sql)
+            ->param(':teacher', $teacher->ID)
+            ->param(':id', $this->ID)
+            ->execute();
+    }
+
+    public function unbind(Model_Teacher $teacher) {
+        if ($this->ID == $teacher->ID)
+            return;
+
+        $sql = "SELECT `Discipline_UnbindTeacher`(:id, :teacher)";
+        DB::query(Database::SELECT, $sql)
+            ->param(':teacher', $teacher->ID)
+            ->param(':id', $this->ID)
+            ->execute();
     }
 
     /**
-     * Check, whether discipline already exists.
-     *
-     * @param $teacher int teacher id
-     * @param $subject int subject id
-     * @param $grade int grade num (1-7)
-     * @return true, if exists
+     * Bind teacher and delegate him the discipline.
+     * @param Model_Teacher $teacher
      */
-    public static function exists($teacher, $subject, $grade) {
-        $disciplines = Model_Disciplines::ofTeacher($teacher);
-        foreach ($disciplines as $d) {
-            if ($subject == $d['SubjectID'] && $grade == $d['GradeNum'])
-                return true;
-        }
-        return false;
+    public function delegateTo(Model_Teacher $teacher) {
+        if ($this->ID == $teacher->ID)
+            return;
+
+        $sql = "SELECT `Discipline_Delegate`(:id, :teacher)";
+        DB::query(Database::SELECT, $sql)
+            ->param(':teacher', $teacher->ID)
+            ->param(':id', $this->ID)
+            ->execute();
     }
 
 
+    public static function changeGrade($disciplineID, $teacherID, $grade) {
+        $sql = "SELECT `ChangeDisciplineGrade`(:teacher, :discipline, :grade) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':teacher'    => $teacherID,
+                ':discipline' => $disciplineID,
+                ':grade'      => $grade,
+            ])->execute();
+    }
+
     /**
-     * @param $teacherID int
+     * @param $teacherID    int
      * @param $disciplineID int
-     * @param $milestone int
+     * @param $milestone    int
      * @return Database_Result
      */
     public static function setMilestone($teacherID, $disciplineID, $milestone) {
-        $sql = "SELECT `RestrictAfterMilestone`('$teacherID', '$disciplineID', '$milestone') AS 'Num'";
-        return DB::query(Database::SELECT, $sql)->execute();
+        $sql = "SELECT `RestrictAfterMilestone`(:teacher, :discipline, milestone) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':teacher'    => $teacherID,
+                ':discipline' => $disciplineID,
+                ':milestone'  => $milestone,
+            ])->execute();
     }
 
     /**
-     * @param $facultyID int
+     * @param $facultyID  int
      * @param $semesterID int
      * @return Database_Result
      */
     public static function getMilestone($facultyID, $semesterID) {
-        $sql = "SELECT `GetMilestone`('$facultyID', '$semesterID') AS 'Num'";
-        return DB::query(Database::SELECT, $sql)->execute();
+        $sql = "SELECT `GetMilestone`(:faculty, :semester) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':faculty', $facultyID)
+            ->param(':semester', $semesterID)
+            ->execute();
     }
 
 
     /**
-     * @param $teacherID int
-     * @param $facultyID int
-     * @param $milestone int
+     * @param $teacherID  int
+     * @param $facultyID  int
+     * @param $milestone  int
+     * @param $semesterID int
      * @return Database_Result
      */
-    public static function setMilestoneForCredits($teacherID, $facultyID, $milestone) {
-        $sql = "SELECT `RestrictAfterMilestoneForCredits`('$teacherID', '$facultyID', '$milestone') AS 'Num'";
-        return DB::query(Database::SELECT, $sql)->execute();
+    public static function setMilestoneForCredits($teacherID, $facultyID, $milestone, $semesterID = null) {
+        $semesterID = $semesterID ? $semesterID : User::instance()->SemesterID;
+        $sql = "SELECT `RestrictAfterMilestoneForCredits`(:teacherID, :facultyID, :milestone, :semesterID) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':teacherID'  => $teacherID,
+                ':facultyID'  => $facultyID,
+                ':milestone'  => $milestone,
+                ':semesterID' => $semesterID,
+            ])->execute();
     }
 
 }
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Model/Disciplines.php b/~dev_rating/application/classes/Model/Disciplines.php
deleted file mode 100644
index 6007308fe54beddf8f701c06014c0b37848638c5..0000000000000000000000000000000000000000
--- a/~dev_rating/application/classes/Model/Disciplines.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-
-class Model_Disciplines extends Model
-{
-    /**
-     * @param $id int student id
-     * @return Database_Result select from <tt>view_disciplines</tt> table
-     */
-    public static function ofStudent($id) {
-        $sql = "CALL `GetDisciplinesForStudent`('$id'); ";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    /**
-     * @param $id int faculty id
-     * @return Database_Result select from <tt>view_disciplines</tt> table
-     */
-    public static function ofFaculty($id) {
-        $sql = "CALL `GetDisciplines`('$id'); ";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    /**
-     * @param $id int teacher id
-     * @return Database_Result
-     */
-    public static function ofTeacher($id)
-    {
-        $sql = "CALL `GetDisciplinesForTeacher`('$id'); ";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    /**
-     * @param $group int group id
-     * @return Database_Result
-     */
-    public static function ofGroup($group) {
-        $sql = "CALL `GetDisciplinesForGroup`('$group')";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    // TODO: Методы для получения списка дисциплин
-}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Model/Faculties.php b/~dev_rating/application/classes/Model/Faculties.php
index 83ad3a47ca7646d6ddb46d58b934f716ceae19dd..d3b081c2be9c9f408cbb2576dda58edf4abae512 100644
--- a/~dev_rating/application/classes/Model/Faculties.php
+++ b/~dev_rating/application/classes/Model/Faculties.php
@@ -2,17 +2,10 @@
 
 class Model_Faculties extends Model
 {
-    public static function getFaculties() {
+    // todo: should generate an array of Model_Faculty
+    public static function load() {
         $sql = "CALL `GetFaculties`(); ";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function toArray() {
-        $faculties = self::getFaculties();
-
-        $list = array();
-        foreach ($faculties as $row)
-            $list[] = $row;
-        return $list;
+        return DB::query(Database::SELECT, $sql)
+            ->execute()->as_array();
     }
 }
diff --git a/~dev_rating/application/classes/Model/Faculty.php b/~dev_rating/application/classes/Model/Faculty.php
new file mode 100644
index 0000000000000000000000000000000000000000..ca7140acdbdefcaef7f5116ff92b3fa3f75ddf1b
--- /dev/null
+++ b/~dev_rating/application/classes/Model/Faculty.php
@@ -0,0 +1,43 @@
+<?php defined('SYSPATH') or die('No direct script access.');
+
+class Model_Faculty extends Model
+{
+    private $id;
+
+    public static function with($id) {
+        $f = new self();
+        $f->id = (int) $id;
+        return $f;
+    }
+
+    /** @return Model_Discipline[] */
+    public function getDisciplines($semesterID = null) {
+        $semesterID = $semesterID ? $semesterID : User::instance()->SemesterID;
+        $sql = "CALL `GetDisciplines`(:id, :semesterID)";
+        $query = DB::query(Database::SELECT, $sql)
+            ->param(':id', $this->id)
+            ->param(':semesterID', $semesterID)
+            ->execute();
+
+        $list = [];
+        foreach ($query as $data)
+            $list[] = new Model_Discipline($data, true);
+
+        return $list;
+    }
+
+    public function getGroups($grade) {
+        $sql = "CALL `GetGroups`(:grade, :id)";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':grade', (int) $grade)
+            ->param(':id', $this->id)
+            ->execute()->as_array();
+    }
+
+    public function getSubjects() {
+        $sql = "CALL `GetSubjects`(:faculty)";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':faculty', $this->id)
+            ->execute()->as_array();
+    }
+}
diff --git a/~dev_rating/application/classes/Model/Grades.php b/~dev_rating/application/classes/Model/Grades.php
index 938b9c8670cfbb3f7107fdd366d14d848fbeb569..eadae6ec25fc03164fcd39f696cfe6434d5df3ec 100644
--- a/~dev_rating/application/classes/Model/Grades.php
+++ b/~dev_rating/application/classes/Model/Grades.php
@@ -9,7 +9,7 @@ class Model_Grades extends Model
 
     public static function toArray() {
         $grades = self::GetGrades();
-        $list = array();
+        $list = [];
 
         foreach ($grades as $row) {
             if ($row['Degree'] == 'bachelor' || $row['Degree'] == 'specialist')
@@ -23,16 +23,7 @@ class Model_Grades extends Model
     }
 
     public static function getDegreeTitle($degree) {
-        switch ($degree) {
-            case 'bachelor':
-                return 'Бакалавриат';
-            case 'specialist':
-                return 'Специалитет';
-            case 'master':
-                return 'Магистратура';
-            default:
-                return $degree;
-        }
+        return RusLang::tr($degree);
     }
 
     public static function getDegreeType($degree) {
@@ -51,7 +42,7 @@ class Model_Grades extends Model
     /** @return array an array with elements, grouped by grades. */
     public static function toStructuredArray() {
         $grades = self::toArray();
-        $list = array();
+        $list = [];
         $degree = 'null';
         $i = 0;
 
diff --git a/~dev_rating/application/classes/Model/Group.php b/~dev_rating/application/classes/Model/Group.php
new file mode 100644
index 0000000000000000000000000000000000000000..d886bfb91ff7eb18482e5e60b376e40fcb8c52dc
--- /dev/null
+++ b/~dev_rating/application/classes/Model/Group.php
@@ -0,0 +1,28 @@
+<?php defined('SYSPATH') or die('No direct script access.');
+
+class Model_Group extends Model
+{
+    private $id;
+
+    public static function with($id) {
+        $g = new self();
+        $g->id = (int) $id;
+        return $g;
+    }
+
+    /** @return Model_Discipline[] */
+    public function getDisciplines($lazy = true, $semesterID = null) {
+        $semesterID = $semesterID ? $semesterID : User::instance()->SemesterID;
+        $sql = "CALL `GetDisciplinesForGroup`(:id, :semesterID)";
+        $query = DB::query(Database::SELECT, $sql)
+            ->param(':id', $this->id)
+            ->param(':semesterID', $semesterID)
+            ->execute();
+
+        $list = [];
+        foreach ($query as $data)
+            $list[] = new Model_Discipline($data, true, $lazy);
+
+        return $list;
+    }
+}
diff --git a/~dev_rating/application/classes/Model/Groups.php b/~dev_rating/application/classes/Model/Groups.php
deleted file mode 100644
index 04532574eae9f31f2ef905ab532db66dabec9126..0000000000000000000000000000000000000000
--- a/~dev_rating/application/classes/Model/Groups.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-
-class Model_Groups extends Model
-{
-    public static function getGroupsForDiscipline($disciplineID) {
-        $sql = "CALL `GetGroupsForDiscipline`('$disciplineID'); ";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function getGroups($grade, $facultyID) {
-        $sql = "CALL `GetGroups`('$grade', '$facultyID'); ";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function forDiscipline($DisciplineID) {
-        $groups = self::getGroupsForDiscipline($DisciplineID);
-
-        $list = array();
-        foreach ($groups as $row)
-            $list[] = $row;
-
-        return $list;
-    }
-
-    public static function orderByGroups($GradeID, $FacultyID) {
-        $groups = self::getGroups($GradeID, $FacultyID);
-
-        $list = array();
-        foreach ($groups as $row)
-            $list[] = $row;
-
-        return $list;
-    }
-
-    // TODO: Методы для получения списка учебных групп
-}
diff --git a/~dev_rating/application/classes/Model/Helper/Builder.php b/~dev_rating/application/classes/Model/Helper/Builder.php
new file mode 100644
index 0000000000000000000000000000000000000000..2aa990852f32812207366f22115d439656c464a4
--- /dev/null
+++ b/~dev_rating/application/classes/Model/Helper/Builder.php
@@ -0,0 +1,13 @@
+<?php defined('SYSPATH') or die('No direct script access.');
+
+class Model_Helper_Builder extends Model
+{
+    protected $data;
+
+    private static $create_new = '__CREATE__!@#$%^&;';
+
+    function __construct() {
+        // Variable, allows to create new instance in db
+        $this->data = [self::$create_new => true];
+    }
+}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Model/Helper/CourseWorkBuilder.php b/~dev_rating/application/classes/Model/Helper/CourseWorkBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..9257035b3fe3112720af0b9fa5ace0bf4eb07b63
--- /dev/null
+++ b/~dev_rating/application/classes/Model/Helper/CourseWorkBuilder.php
@@ -0,0 +1,74 @@
+<?php
+
+class Model_Helper_CourseWorkBuilder extends Model_Helper_Builder
+{
+    const COURSEWORK_DISCIPLINE_ID = 346;
+
+    public function create() {
+        $this->data += [
+            'Lectures'  => 0,
+            'Practice'  => 0,
+            'Labs'      => 0,
+            'IsLocked'  => false,
+            'Type'      => 'grading_credit',
+        ];
+
+        if (count($this->data) < 11)  # fixme: bad const
+            throw new InvalidArgumentException('not enough arguments');
+
+        return new Model_CourseWork($this->data, false);
+    }
+
+    function & author($id) {
+        if (!is_numeric($id) || $id <= 0)
+            throw new InvalidArgumentException('author id is incorrect');
+        $this->data['AuthorID'] = (int) $id;
+        return $this;
+    }
+
+    function & grade($id) {
+        if (!is_numeric($id) || $id <= 0)
+            throw new InvalidArgumentException('grade id is incorrect');
+        $this->data['GradeID'] = (int) $id;
+        return $this;
+    }
+
+    function & faculty($id) {
+        if (!is_numeric($id) || $id <= 0)
+            throw new InvalidArgumentException('faculty id is incorrect');
+        $this->data['FacultyID'] = (int) $id;
+        return $this;
+    }
+
+    /** Must be called after subtype() */
+    function & subject($id) {
+        if ($this->data['Subtype'] == Model_CourseWork::SCIENTIFIC)
+            $id = self::COURSEWORK_DISCIPLINE_ID;
+
+        if (!is_numeric($id) || $id <= 0)
+            throw new InvalidArgumentException('subject id is incorrect');
+
+        $this->data['SubjectID'] = (int) $id;
+        return $this;
+    }
+
+    function & subtype($name) {
+        switch ($name) {
+            case Model_CourseWork::DISCIPLINARY:
+            case Model_CourseWork::SCIENTIFIC:
+                break;
+            default:
+                throw new InvalidArgumentException('Subtype is incorrect');
+        }
+
+        $this->data['Subtype'] = $name;
+        return $this;
+    }
+
+    function & semester($id) {
+        if (!is_numeric($id) || $id <= 0)
+            throw new InvalidArgumentException('semester id is incorrect');
+        $this->data['SemesterID'] = (int) $id;
+        return $this;
+    }
+}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Model/Helper/DisciplineBuilder.php b/~dev_rating/application/classes/Model/Helper/DisciplineBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..e161e445ef52c7cf4c1fd4ed9deed3c02ddbc679
--- /dev/null
+++ b/~dev_rating/application/classes/Model/Helper/DisciplineBuilder.php
@@ -0,0 +1,80 @@
+<?php defined('SYSPATH') or die('No direct script access.');
+
+class Model_Helper_DisciplineBuilder extends Model_Helper_Builder
+{
+    public function create() {
+        $this->data += [
+            'Subtype' => null,
+            'IsLocked' => false,
+            'Milestone' => 0,
+        ];
+
+        if (count($this->data) < 12)  # fixme: bad const
+            throw new InvalidArgumentException('not enough arguments');
+
+        return new Model_Discipline($this->data, false);
+    }
+
+    function & author($id) {
+        if (!is_numeric($id) || $id <= 0)
+            throw new InvalidArgumentException('author id is incorrect');
+        $this->data['AuthorID'] = (int) $id;
+        return $this;
+    }
+
+    function & grade($id) {
+        if (!is_numeric($id) || $id <= 0)
+            throw new InvalidArgumentException('grade id is incorrect');
+        $this->data['GradeID'] = (int) $id;
+        return $this;
+    }
+
+    function & faculty($id) {
+        if (!is_numeric($id) || $id <= 0)
+            throw new InvalidArgumentException('faculty id is incorrect');
+        $this->data['FacultyID'] = (int) $id;
+        return $this;
+    }
+
+    function & subject($id) {
+        if (!is_numeric($id) || $id <= 0)
+            throw new InvalidArgumentException('subject id is incorrect');
+        $this->data['SubjectID'] = (int) $id;
+        return $this;
+    }
+
+    function & lectures($hours) {
+        if (!is_numeric($hours) || $hours < 0)
+            throw new InvalidArgumentException('lectures hours are incorrect');
+        $this->data['Lectures'] = (int) $hours;
+        return $this;
+    }
+
+    function & practice($hours) {
+        if (!is_numeric($hours) || $hours < 0)
+            throw new InvalidArgumentException('practice hours are incorrect');
+        $this->data['Practice'] = (int) $hours;
+        return $this;
+    }
+
+    function & labs($hours) {
+        if (!is_numeric($hours) || $hours < 0)
+            throw new InvalidArgumentException('labs hours are incorrect');
+        $this->data['Labs'] = (int) $hours;
+        return $this;
+    }
+
+    function & type($name) {
+        if (!$name)  // todo: enum
+            throw new InvalidArgumentException('type is incorrect');
+        $this->data['Type'] = $name;
+        return $this;
+    }
+
+    function & semester($id) {
+        if (!is_numeric($id) || $id <= 0)
+            throw new InvalidArgumentException('semester id is incorrect');
+        $this->data['SemesterID'] = (int) $id;
+        return $this;
+    }
+}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Model/Map.php b/~dev_rating/application/classes/Model/Map.php
index 51d05c210d8ce4efcf4b57171410fc52474388ca..9eb7900d2886e8815c2818334da9b73f7ee0e288 100644
--- a/~dev_rating/application/classes/Model/Map.php
+++ b/~dev_rating/application/classes/Model/Map.php
@@ -1,181 +1,202 @@
 <?php defined('SYSPATH') or die('No direct script access.');
-  
+
 class Model_Map extends Model
 {
-    public static function addModuleBonus($teacherID, $disciplineID)
-    {
-        $sql = "SELECT `AddModuleBonus`('$teacherID', '$disciplineID') AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function deleteModuleBonus($teacherID, $disciplineID)
-    {
-        $sql = "SELECT `DeleteModuleBonus`('$teacherID', '$disciplineID') AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function addModule($teacherID, $disciplineID, $title)
-    {
-        $db = Database::instance();
-        $title = $db->escape($title);
-        $sql = "SELECT `AddModule`('$teacherID', '$disciplineID', $title) AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function deleteModule($teacherID, $moduleID)
-    {
-		$sql = "SELECT `DeleteModule`('$teacherID', '$moduleID') AS `Num`;";
-		return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function DelegateDiscipline($teacherID, $NewAuthorID, $DisciplineID)
-    {
-        $sql = "SELECT `DelegateDiscipline`('$teacherID', '$NewAuthorID', '$DisciplineID') AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function changeModuleName($teacherID, $moduleID, $Name)
-    {
-        $db = Database::instance();
-        $Name = $db->escape($Name);
-        $sql = "SELECT `ChangeModuleName`('$teacherID', '$moduleID', $Name) AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function addSubmodule($teacherID, $moduleID, $maxRate, $title, $description, $typeControl)
-    {
-        $sql = "SELECT `AddSubmodule`('$teacherID', '$moduleID', '$maxRate', '$title', '$description', '$typeControl') AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function deleteSubmodule($teacherID, $submoduleID)
-    {
-        $sql = "SELECT `DeleteSubmodule`('$teacherID', '$submoduleID') AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function changeSubmoduleName($teacherID, $submoduleID, $Name)
-    {
-        $db = Database::instance();
-        $Name = $db->escape($Name);
-        $sql = "SELECT `ChangeSubmoduleName`('$teacherID', '$submoduleID', $Name) AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-
-
-
-
-    public static function swapModuleOrder($teacherID, $moduleID1, $moduleID2)
-    {
-        $sql = "SELECT `SwapModuleOrder`('$teacherID', '$moduleID1', '$moduleID2') AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function swapSubmoduleOrder($teacherID, $submoduleID1, $submoduleID2)
-    {
-        $sql = "SELECT `SwapSubmoduleOrder`('$teacherID', '$submoduleID1', '$submoduleID2') AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function changeSubmoduleMaxAndControl($teacherID, $SubmoduleID, $MaxRate, $ControlType)
-    {
-        $db = Database::instance();
-        $ControlType = $db->escape($ControlType);
-        $sql = "SELECT `ChangeSubmoduleMaxAndControl`('$teacherID', '$SubmoduleID', '$MaxRate', $ControlType) AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function getMapForDiscipline($disciplineID)
-    {
-        $sql = "CALL `GetRoadmap`('$disciplineID'); ";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function changeDisciplineSubject($teacherID, $DisciplineID, $SubjectID)
-    {
-        $sql = "SELECT `ChangeDisciplineSubject`('$teacherID', '$DisciplineID', '$SubjectID') AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function changeDisciplineControl($teacherID, $DisciplineID, $Control)
-    {
-        $db = Database::instance();
-        $Control = $db->escape($Control);
-        $sql = "SELECT `ChangeDisciplineControl`('$teacherID', '$DisciplineID', $Control) AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function changeDisciplineHours($teacherID, $DisciplineID, $Hours, $Type)
-    {
-        $db = Database::instance();
-        $Type = $db->escape($Type);
-        $sql = "SELECT `ChangeDisciplineHours`('$teacherID', '$DisciplineID', '$Hours', $Type) AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function deleteDiscipline($AuthorID, $DisciplineID)
-    {
-        $sql = "SELECT `DeleteDiscipline`('$AuthorID', '$DisciplineID') AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-
-    public static function bindGroup($teacherID, $DisciplineID, $GroupID)
-    {
-        $sql = "SELECT `BindGroup`('$teacherID', '$DisciplineID', '$GroupID') AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function unbindGroup($teacherID, $DisciplineID, $GroupID)
-    {
-        $sql = "SELECT `UnbindGroup`('$teacherID', '$DisciplineID', '$GroupID') AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
+    public static function addModuleBonus($teacherID, $disciplineID) {
+        $sql = "SELECT `AddModuleBonus`(:teacher, :discipline) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':teacher', $teacherID)
+            ->param(':discipline', $disciplineID)
+            ->execute();
+    }
+
+    public static function deleteModuleBonus($teacherID, $disciplineID) {
+        $sql = "SELECT `DeleteModuleBonus`(:teacher, :discipline) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':teacher', $teacherID)
+            ->param(':discipline', $disciplineID)
+            ->execute();
+    }
+
+    public static function addModule($teacherID, $disciplineID, $title) {
+        $sql = "SELECT `AddModule`(:teacher, :discipline, :title) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':teacher'    => $teacherID,
+                ':discipline' => $disciplineID,
+                'title'       => $title,
+            ])->execute();
+    }
+
+    public static function deleteModule($teacherID, $moduleID) {
+        $sql = "SELECT `DeleteModule`(:teacher, :module) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':teacher', $teacherID)
+            ->param(':module', $moduleID)
+            ->execute();
+    }
+
+    public static function changeModuleName($teacherID, $moduleID, $name) {
+        $sql = "SELECT `ChangeModuleName`(:teacher, :module, :name) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':teacher' => $teacherID,
+                ':module'  => $moduleID,
+                ':name'    => $name,
+            ])->execute();
+    }
+
+    public static function addSubmodule($teacherID, $moduleID, $maxRate, $title, $description, $typeControl) {
+        $sql = "SELECT `AddSubmodule`(:teacher, :moduleID, :maxRate, :title, :desc, :control) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':teacher'  => $teacherID,
+                ':moduleID' => $moduleID,
+                ':maxRate'  => $maxRate,
+                ':title'    => $title,
+                ':desc'     => $description,
+                ':control'  => $typeControl,
+            ])->execute();
+    }
+
+    public static function deleteSubmodule($teacherID, $submoduleID) {
+        $sql = "SELECT `DeleteSubmodule`(:teacher, :submodule) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':teacher'   => $teacherID,
+                ':submodule' => $submoduleID,
+            ])->execute();
+    }
+
+    public static function changeSubmoduleName($teacherID, $submoduleID, $name) {
+        $sql = "SELECT `ChangeSubmoduleName`(:teacher, :submodule, :name) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':teacher'   => $teacherID,
+                ':submodule' => $submoduleID,
+                ':name'      => $name,
+            ])->execute();
+    }
+
+
+    public static function swapModuleOrder($teacherID, $moduleID1, $moduleID2) {
+        $sql = "SELECT `SwapModuleOrder`(:teacher, :moduleID1, :moduleID2) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':teacher'   => $teacherID,
+                ':moduleID1' => $moduleID1,
+                ':moduleID2' => $moduleID2,
+            ])->execute();
+    }
+
+    public static function swapSubmoduleOrder($teacherID, $submoduleID1, $submoduleID2) {
+        $sql = "SELECT `SwapSubmoduleOrder`(:teacher, :submodule1, :submodule2) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':teacher'    => $teacherID,
+                ':submodule1' => $submoduleID1,
+                ':submodule2' => $submoduleID2,
+            ])->execute();
+    }
+
+    public static function changeSubmoduleMaxAndControl($teacherID, $submoduleID, $maxRate, $controlType) {
+        $sql = "SELECT `ChangeSubmoduleMaxAndControl`(:teacher, :submodule, :maxRate, :control) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':teacher'   => $teacherID,
+                ':submodule' => $submoduleID,
+                ':maxRate'   => $maxRate,
+                ':control'   => $controlType,
+            ])->execute();
+    }
+
+    public static function getMapForDiscipline($disciplineID) {
+        $sql = "CALL `GetRoadmap`(:discipline); ";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':discipline', $disciplineID)
+            ->execute();
+    }
+
+    public static function changeDisciplineSubject($teacherID, $disciplineID, $subjectID) {
+        $sql = "SELECT `ChangeDisciplineSubject`(:teacher, :discipline, :subject) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':teacher'    => $teacherID,
+                ':discipline' => $disciplineID,
+                ':subject'    => $subjectID,
+            ])->execute();
+    }
+
+    public static function changeDisciplineControl($teacherID, $disciplineID, $control) {
+        $sql = "SELECT `ChangeDisciplineControl`(:teacher, :discipline, :control) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':teacher'    => $teacherID,
+                ':discipline' => $disciplineID,
+                ':control'    => $control,
+            ])->execute();
+    }
+
+    public static function changeDisciplineHours($teacherID, $disciplineID, $hours, $type) {
+        $sql = "SELECT `ChangeDisciplineHours`(:teacher, :discipline, :hours, :type) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':teacher'    => $teacherID,
+                ':discipline' => $disciplineID,
+                ':hours'      => $hours,
+                ':type'       => $type,
+            ])->execute();
+    }
+
+    public static function bindGroup($teacherID, $disciplineID, $groupID) {
+        $sql = "SELECT `BindGroup`(:teacher, :discipline, :group) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':teacher'    => $teacherID,
+                ':discipline' => $disciplineID,
+                ':group'      => $groupID,
+            ])->execute();
+    }
+
+    public static function unbindGroup($teacherID, $disciplineID, $groupID) {
+        $sql = "SELECT `UnbindGroup`(:teacher, :discipline, :group) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':teacher'    => $teacherID,
+                ':discipline' => $disciplineID,
+                ':group'      => $groupID,
+            ])->execute();
+    }
+
+    public static function bindStudent($teacherID, $disciplineID, $studentID) {
+        $sql = "SELECT `BindStudent`(:teacher, :discipline, :student) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':teacher'    => $teacherID,
+                ':discipline' => $disciplineID,
+                ':student'    => $studentID,
+            ])->execute();
+    }
+
+    public static function UnbindStudent($teacherID, $disciplineID, $studentID) {
+        $sql = "SELECT `UnbindStudent`(:teacher, :discipline, :student) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':teacher'    => $teacherID,
+                ':discipline' => $disciplineID,
+                ':student'    => $studentID,
+            ])->execute();
     }
 
-    public static function bindStudent($teacherID, $DisciplineID, $StudentID)
-    {
-        $sql = "SELECT `BindStudent`('$teacherID', '$DisciplineID', '$StudentID') AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function UnbindStudent($teacherID, $DisciplineID, $StudentID)
-    {
-        $sql = "SELECT `UnbindStudent`('$teacherID', '$DisciplineID', '$StudentID') AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function bindTeacher($AccessedTeacher, $BindingTeacher, $DisciplineID)
-    {
-        $sql = "SELECT `BindTeacher`('$AccessedTeacher', '$BindingTeacher', '$DisciplineID') AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function unbindTeacher($AccessedTeacher, $BindingTeacher, $DisciplineID)
-    {
-        $sql = "SELECT `UnbindTeacher`('$AccessedTeacher', '$BindingTeacher', '$DisciplineID') AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-
-
-
-
-
-    // // deprecated (moved in helpers)
-    // public function searchTeachers($FacultyID, $DepartmentID, $Last, $First, $Second) {
-    //     $sql = "CALL `SearchTeachers`('$FacultyID', '$DepartmentID', '$Last', '$First', '$Second'); ";
-    //     return DB::query(Database::SELECT, $sql)->execute();
-    // }
-    
     // deprecated (moved in helpers)
-    public static function searchTeachers($FacultyID, $DepartmentID, $Name, $DisciplineID)
-    {
-        $db = Database::instance();
-        $Name = $db->escape($Name);
-        $sql = "CALL `SearchTeachers`('$FacultyID', '$DepartmentID', $Name, '$DisciplineID'); ";
-        return DB::query(Database::SELECT, $sql)->execute();
+    public static function searchTeachers($facultyID, $departmentID, $name, $disciplineID) {
+        $sql = "CALL `SearchTeachers`(:faculty, :department, :name, :discipline)";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':name'       => $name,
+                ':faculty'    => $facultyID,
+                ':department' => $departmentID,
+                ':discipline' => $disciplineID,
+            ])->execute();
     }
-	
-
 }
diff --git a/~dev_rating/application/classes/Model/Rating.php b/~dev_rating/application/classes/Model/Rating.php
index 6467096fc529b5bfba515dadb3bb101f0940b2e1..9d2707a1c64fdff1d46dade7183f917e2bf9cfe2 100644
--- a/~dev_rating/application/classes/Model/Rating.php
+++ b/~dev_rating/application/classes/Model/Rating.php
@@ -2,8 +2,8 @@
 
 class Model_Rating extends Model
 {
-    public static function GetStudentsForRating($disciplineID) {
-        $sql = "CALL `GetStudentsForRating`('$disciplineID'); ";
+    public static function GetStudentsForRating($discipline) {
+        $sql = "CALL `GetStudentsForRating`(:discipline)";
         return DB::query(Database::SELECT, $sql)->execute();
     }
 
@@ -13,69 +13,124 @@ class Model_Rating extends Model
      * @return Database_Result select from <tt>view_roadmap</tt> table
      */
     public static function getMapForDiscipline($discipline) {
-        $sql = "CALL `GetRoadmap`('$discipline'); ";
-        return DB::query(Database::SELECT, $sql)->execute();
+        $sql = "CALL `GetRoadmap`(:discipline)";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':discipline', $discipline)
+            ->execute();
     }
 
     /**
      * @param $discipline int discipline id
-     * @param $student int student id
+     * @param $student    int student id
      * @return Database_Result
      */
     public static function getRates($discipline, $student) {
-        $sql = "CALL `GetRates`('$student', '$discipline'); ";
-        return DB::query(Database::SELECT, $sql)->execute();
+        $sql = "CALL `GetRates`(:student, :discipline)";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':discipline', $discipline)
+            ->param(':student', $student)
+            ->execute();
     }
 
     /**
      * @param $discipline int discipline id
-     * @param $student int student id
+     * @param $student    int student id
      * @return Database_Result
      */
     public static function getExamRates($discipline, $student) {
-        $sql = "CALL `GetRatesExam`('$student', '$discipline'); ";
-        return DB::query(Database::SELECT, $sql)->execute();
+        $sql = "CALL `GetRatesExam`(:student, :discipline)";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':discipline', $discipline)
+            ->param(':student', $student)
+            ->execute();
     }
 
-    public static function GetMapForDisciplineExam($disciplineID) {
-        $sql = "CALL `GetRoadmapExam`('$disciplineID'); ";
-        return DB::query(Database::SELECT, $sql)->execute();
+    public static function GetMapForDisciplineExam($discipline) {
+        $sql = "CALL `GetRoadmapExam`(:discipline)";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':discipline', $discipline)
+            ->execute();
     }
 
-    public static function getMapForStudent($studentID, $disciplineID)
-    {
-        $sql = "CALL `GetMapForStudent`('$studentID', '$disciplineID'); ";
-        return DB::query(Database::SELECT, $sql)->execute();
+    public static function getMapForStudent($student, $discipline) {
+        $sql = "CALL `GetMapForStudent`(:student, :discipline)";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':discipline', $discipline)
+            ->param(':student', $student)
+            ->execute();
     }
 
-    public static function getAttestationData($disciplineID, $groupID)
-    {
-        $sql = "CALL `GetAttestationData`($disciplineID, $groupID)";
-        return DB::query(Database::SELECT, $sql)->execute();
+    public static function getAttestationData($discipline, $group) {
+        $sql = "CALL `GetAttestationData`(:discipline, :group)";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':discipline', $discipline)
+            ->param(':group', $group)
+            ->execute();
     }
 
-    public static function SetStudentRate($teacherID, $studentID, $submoduleID, $rate) {
-        $sql = "SELECT `SetStudentRate`('$teacherID', '$studentID', '$submoduleID', '$rate') AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
+    public static function SetStudentRate($teacher, $student, $submodule, $rate) {
+        if ($rate == -1) $rate = null;  # fixme: kind of shit
+
+        $sql = "SELECT `SetStudentRate`(:teacher, :student, :submodule, :rate) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':teacher'   => $teacher,
+                ':student'   => $student,
+                ':submodule' => $submodule,
+                ':rate'      => (int) $rate
+            ])->execute();
     }
 
-    public static function GetStudentRate($studentID, $disciplineID) {
-        $sql = "SELECT `GetRateForDisc`('$studentID', '$disciplineID') AS `Num`;";
-        return DB::query(Database::SELECT, $sql)->execute();
+    public static function getRatesForStudentsGroup($discipline, $group) {
+        $sql = "CALL `GetRatesForGroup`(:discipline, :group)";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':discipline' => $discipline,
+                ':group'      => $group,
+            ])->execute();
     }
 
-    public static function getRatesForStudentsGroup($disciplineID, $groupID) {
-        $sql = "CALL `GetRatesForGroup`('$disciplineID', '$groupID')";
-        return DB::query(Database::SELECT, $sql)->execute();
+    public static function getRatesForStudentsGroupByStage($discipline, $group, $stage) {
+        $sql = "CALL `GetRatesForGroupByStage`(:discipline, :group, :stage)";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':discipline' => $discipline,
+                ':group'      => $group,
+                ':stage'      => $stage
+            ])->execute();
     }
 
-    public static function getRatesForStudentsGroupByStage($disciplineID, $groupID, $stage) {
-        $sql = "CALL `GetRatesForGroupByStage`('$disciplineID', '$groupID', '$stage');";
-        return DB::query(Database::SELECT, $sql)->execute();
+    public static function getFinalFormInfo($discipline, $group) {
+        $sql = "CALL `getFinalFormInfo`(:discipline, :group)";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':discipline' => $discipline,
+                ':group'      => $group,
+            ])->execute();
     }
 
-    public static function getFinalFormInfo($disciplineID, $groupID) {
-        $sql = "CALL `getFinalFormInfo`('$disciplineID', '$groupID')";
-        return DB::query(Database::SELECT, $sql)->execute();
+    /**
+     * Get count of related with discipline records in `rating_table`.
+     * @param Model_Discipline $discipline
+     * @return int
+     */
+    public static function count(Model_Discipline $discipline) {
+        $sql = "SELECT `Discipline_CountRatings`(:discipline) AS `res`";
+        $res = DB::query(Database::SELECT, $sql)
+            ->param(':discipline', $discipline->ID)
+            ->execute();
+
+        return (int) $res->get('res');
+    }
+
+    public static function setExamPeriodOption($student, $submodule, $option) {
+        // option is absence or pass or null
+        $sql = "SELECT `SetExamPeriodOption`(:student, :submodule, :option) As `ErrorCode`";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':student'   => $student,
+                ':submodule' => $submodule,
+                ':option'    => $option
+            ])->execute()[0];
     }
 }
diff --git a/~dev_rating/application/classes/Model/Semesters.php b/~dev_rating/application/classes/Model/Semesters.php
index 77124664ad1e443ff16e59d526cf641b7057de61..59f8841a80c00dc22a5ccf34ed7b38690fce19fb 100644
--- a/~dev_rating/application/classes/Model/Semesters.php
+++ b/~dev_rating/application/classes/Model/Semesters.php
@@ -1,29 +1,47 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
+/**
+ * Class Model_Semesters
+ *
+ * @property int    ID
+ * @property int    Num
+ * @property int    Year
+ * @property string Season
+ */
 class Model_Semesters extends Model
 {
-    /**
-     * @param $id int semester id
-     * @return array data from <tt>semesters</tt> table
-     */
-    public static function getInfo($id) {
-        $sql = "CALL `GetSemesterInfo`('$id'); ";
-        return DB::query(Database::SELECT, $sql)->execute()->offsetGet(0);
+    private $data;
+
+    public function __construct($data) {
+        $this->data = $data;
+        $this->data['Season'] = $this->data['Num'] == 1 ? 'autumn' : 'spring';
+    }
+
+    public function __isset($name) {
+        return isset($this->data[$name]);
+    }
+
+    public function __get($name) {
+        return $this->data[$name];
     }
 
-    public static function getSemesters() {
-        $sql = "CALL `GetSemesters`()";
-        return DB::query(Database::SELECT, $sql)->execute();
+
+    public static function load($id) {
+        $data = DB::query(Database::SELECT, "CALL `GetSemesterInfo`(:id)")
+            ->param(':id', $id)->execute();
+
+        if (!$data->count())
+            throw new LogicException(Error::ID_IS_INCORRECT);
+
+        return new self($data[0]);
     }
 
-    public static function toArray() {
-        $semesters = self::getSemesters();
-        $list = array();
+    public static function loadAll() {
+        $res = DB::query(Database::SELECT, "CALL `GetSemesters`()")->execute();
 
-        foreach ($semesters as $row) {
-            $row['Num'] = ($row['Num'] == 1) ? 'Осенний' : 'Весенний';
-            $list[] = $row;
-        }
+        $list = [];
+        foreach ($res as $semester)
+            $list[$semester['ID']] = new self($semester);
 
         return $list;
     }
diff --git a/~dev_rating/application/classes/Model/Student.php b/~dev_rating/application/classes/Model/Student.php
index 4e826ef39e1dd021bf2e6b88348d00cea200672a..080ad8b9de73d97159ebbb93fa7dd1bbbc613273 100644
--- a/~dev_rating/application/classes/Model/Student.php
+++ b/~dev_rating/application/classes/Model/Student.php
@@ -1,82 +1,70 @@
 <?php defined('SYSPATH') or die('No direct script access.');
-  
-class Model_Student extends Model
-{
-    private $id;
-
-    public static function load($id) {
-        $student = new self();
-        $student->id = (int) $id;
-
-        // todo: there should be a function to load data from db
-        //    Student_Get(id): array
 
-        return $student;
+/**
+ * Class Model_Student
+ */
+class Model_Student extends Model_Container
+{
+    protected function getInfo($id) {
+        $sql = 'CALL `Student_GetInfo`(:id)';
+        $info = DB::query(Database::SELECT, $sql)
+            ->param(':id', $id)->execute();
+
+        if ($info->count() == 0)
+            throw new InvalidArgumentException('Student not found');
+        return $info[0];
     }
 
     /**
-     * Create new student from a source data.
-     *
-     * todo: no activation code (move the check to a controller)
-     * todo: make Student_Create instead of CreateStudent
-     * todo: test me
-     *
-     * @param $lastName
-     * @param $firstName
-     * @param $secondName
-     * @param $gradeID
-     * @param $activationCode
-     * @return $this;
+     * Create new student in db, based on $data.
      */
-    public static function create($lastName, $firstName, $secondName, $gradeID, $activationCode) {
-        $sql = 'SELECT `CreateStudent`(:last, :first, :second, :grade, :code)';
+    protected function create() {
+        // todo: implement later
+        throw new BadMethodCallException('Method is not implemented yet!');
+    }
 
-        $id = DB::query(Database::SELECT, $sql)
-            ->parameters([
-                'last' => $lastName,
-                'first' => $firstName,
-                'second' => $secondName,
-                'grade' => $gradeID,
-                'code' => $activationCode,
-            ])
+    /** @return Model_Discipline[] */
+    public function getDisciplines($semesterID = null) {
+        $semesterID = $semesterID ? $semesterID : User::instance()->SemesterID;
+        $sql = 'CALL `GetDisciplinesForStudent`(:id, :semesterID)';
+        $query = DB::query(Database::SELECT, $sql)
+            ->param(':id', $this->ID)
+            ->param(':semesterID', $semesterID)
             ->execute();
 
-        return self::load($id);
-    }
-
+        $list = [];
+        foreach ($query as $data)
+            $list[] = new Model_Discipline($data, true);
 
-    // getters and setters
-    function __get($name) {
-        if ($name == 'id')
-            return (int) $this->id;
-        return null;
+        return $list;
     }
 
-    function __set($name, $value) { }
-
     // todo implementation
     public function update() {
         throw new BadMethodCallException('Method is not implemented yet!');
     }
 
     /**
-     * @see students_groups.IsStudyLeave
+     * @see        students_groups.IsStudyLeave
      * @deprecated cause it's not implemented yet
      * @return boolean true, if the student is on leave
      */
     public function inAcademicLeave() {
-        throw new BadMethodCallException("Method is not implemented yet!");
+        throw new BadMethodCallException('Method is not implemented yet!');
     }
 
     /**
      * Send the student to an academic leave.
      * @return $this;
      */
-    public function toAcademicLeave() {
-        $sql = "CALL `ControlStudentGroup`(:id, -1, true);";
+    public function toAcademicLeave($semesterID = null) {
+        $semesterID = $semesterID ? $semesterID : User::instance()->SemesterID;
+        $sql = 'CALL `ControlStudentGroup`(:id, -1, true, :semesterID)';
+
 
         DB::query(Database::SELECT, $sql)
-            ->param(':id', $this->id)
+            ->param(':id', $this->ID)
+            ->param(':semesterID', $semesterID)
             ->execute();
 
         return $this;
@@ -87,12 +75,14 @@ class Model_Student extends Model
      * @param $group int  group id
      * @return $this;
      */
-    public function returnFromAcademicLeave($group) {
-        $sql = "CALL `ControlStudentGroup`(:id, :group, false);";
+    public function returnFromAcademicLeave($group, $semesterID = null) {
+        $semesterID = $semesterID ? $semesterID : User::instance()->SemesterID;;
+        $sql = 'CALL `ControlStudentGroup`(:id, :group, false, :semesterID)';
 
         DB::query(Database::SELECT, $sql)
-            ->param(':id', $this->id)
+            ->param(':id', $this->ID)
             ->param(':group', (int) $group)
+            ->param(':semesterID', $semesterID)
             ->execute();
 
         return $this;
diff --git a/~dev_rating/application/classes/Model/Students.php b/~dev_rating/application/classes/Model/Students.php
index dbf4b7bdbc4e11f1945a7d811dd8876d5890b27b..8069c1962e17119474a4d5c42181db46ab51d535 100644
--- a/~dev_rating/application/classes/Model/Students.php
+++ b/~dev_rating/application/classes/Model/Students.php
@@ -3,7 +3,7 @@
 class Model_Students extends Model
 {
     public static function ofDiscipline($id) {
-        $sql = "CALL `GetStudentsForDiscipline`('$id'); ";
+        $sql = 'CALL `GetStudentsForDiscipline`(:id)';
         return DB::query(Database::SELECT, $sql)->execute();
     }
 
@@ -11,47 +11,74 @@ class Model_Students extends Model
      * @param $group int group id
      * @return Database_Result
      */
-    public static function ofGroup($group) {
-        $sql = "CALL `GetStudents`('$group'); ";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
+    public static function ofGroup($group, $semesterID = null) {
+        $semesterID = $semesterID ? $semesterID : User::instance()->SemesterID;
 
-    /**
-     * @param $grade int grade id
-     * @param $faculty int faculty id
-     * @return Database_Result
-     */
-    public static function getGroups($grade, $faculty) {
-        $sql = "CALL `GetGroups`('$grade', '$faculty'); ";
-        return DB::query(Database::SELECT, $sql)->execute();
+        $sql = 'CALL `GetStudents`(:group, $semester)';
+        return DB::query(Database::SELECT, $sql)
+            ->param(':semester', $semesterID)
+            ->param(':group', $group)
+            ->execute();
     }
 
     public static function getGradeID($gradeNum, $degree) {
         $degree = Database::instance()->escape($degree);
-        $sql = "SELECT `GetGradeID`('$gradeNum', $degree) AS `ID`; ";
-        return DB::query(Database::SELECT, $sql)->execute()->get('ID');
+        $sql = 'SELECT `GetGradeID`(:gradeNum, :degree) AS `ID`';
+        return DB::query(Database::SELECT, $sql)
+            ->param(':grade', $gradeNum)
+            ->param(':degree', $degree)
+            ->execute()->get('ID');
     }
 
     public static function byStudyGroup($groupID) {
         return self::collect(self::ofGroup($groupID));
     }
 
-    public static function byFaculty($facultyID, $gradeID, $groupID) {
-        $sql = "CALL `GetStudentsByFaculty`('$facultyID', '$gradeID', $groupID); ";
-        $students = DB::query(Database::SELECT, $sql)->execute();
+    public static function byFaculty($facultyID, $gradeID = null, $groupID = null, $semesterID = null) {
+        $semesterID = $semesterID ? $semesterID : User::instance()->SemesterID;
+
+        $sql = 'CALL `GetStudentsByFaculty`(:faculty, :grade, :group, :semester)';
+        $students = DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':faculty'  => (int) $facultyID,
+                ':grade'    => (int) $gradeID,
+                ':group'    => (int) $groupID,
+                ':semester' => (int) $semesterID,
+            ])->execute();
+
         return self::collect($students);
     }
 
-    public static function searchStudents($GradeID, $GroupID, $FacultyID, $Name, $DisciplineID) {
-        $Name = Database::instance()->escape($Name);
-        $sql = "CALL `SearchStudents`('$GradeID', '$GroupID', '$FacultyID', $Name, '$DisciplineID'); ";
-        return DB::query(Database::SELECT, $sql)->execute();
+    public static function searchStudents($gradeID, $groupID, $facultyID, $name, $disciplineID) {
+        $sql = 'CALL `SearchStudents`(:grade, :group, :faculty, :name, :discipline)';
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':name'       => $name,
+                ':faculty'    => (int) $facultyID,
+                ':grade'      => (int) $gradeID,
+                ':group'      => (int) $groupID,
+                ':discipline' => (int) $disciplineID,
+            ])->execute();
+    }
+
+    public static function searchStudentsByName($name, $facultyID = null, $gradeID = null, $groupID = null, $semesterID = null) {
+        $semesterID = $semesterID ? $semesterID : User::instance()->SemesterID;
+
+        $sql = 'CALL `SearchStudentsByName`(:name, :faculty, :grade, :group, :semester)';
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':name'     => $name,
+                ':faculty'  => (int) $facultyID,
+                ':grade'    => (int) $gradeID,
+                ':group'    => (int) $groupID,
+                ':semester' => (int) $semesterID,
+            ])->execute()->as_array();
     }
 
     private static function collect($students) {
-        $studentsHandled = array();
-        foreach($students as $row) {
-            $row['Degree'] = Model_Grades::getDegreeTitle($row['Degree']);
+        $studentsHandled = [];
+        foreach ($students as $row) {
+            $row['Degree'] = Model_Grades::getDegreeTitle($row['Degree']);  // todo: remove this one
             $studentsHandled[] = $row;
         }
         return $studentsHandled;
diff --git a/~dev_rating/application/classes/Model/Subjects.php b/~dev_rating/application/classes/Model/Subject.php
similarity index 61%
rename from ~dev_rating/application/classes/Model/Subjects.php
rename to ~dev_rating/application/classes/Model/Subject.php
index 47f2e0c837c6d1c47c84fffe5adb6513408c38a2..bbc5f6253c974330a3bcd6b1291ae0cd54cca579 100644
--- a/~dev_rating/application/classes/Model/Subjects.php
+++ b/~dev_rating/application/classes/Model/Subject.php
@@ -1,6 +1,6 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Model_Subjects
+class Model_Subject
 {
     const MARK_UNDEFINED = 'Undefined';
     const MARK_F  = 'ECTS-F';
@@ -12,15 +12,15 @@ class Model_Subjects
     const MARK_A  = 'ECTS-A';
 
     /**
-     * @param $rate int rate of student
-     * @param $current int current max rate of discipline
+     * @param $rate     int rate of student
+     * @param $current  int current max rate of discipline
      * @param $examRate int exam rate of student
      * @return string mark name
      */
     public static function getECTSMark($rate, $current, $examRate) {
         if ($current <= 0)
             return self::MARK_UNDEFINED;
-        if ($examRate !== NULL AND $examRate < 22)
+        if ($examRate !== null && $examRate < 22)
             return self::MARK_FX;
         return self::compute_mark($rate / $current);
     }
@@ -35,20 +35,16 @@ class Model_Subjects
         return self::MARK_A;
     }
 
-    public static function getSubjects($facultyID) {
-        $sql = "CALL `GetSubjects`('$facultyID');";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
-    public static function byFaculty($FacultyID) {
-        $subjects = self::getSubjects($FacultyID);
 
-        $list = array();
-        foreach ($subjects as $row) {
-            $row['Title'] = $row['Name'];  // fixme: row must contain Title field by default
-            $list[] = $row;
-        }
+    public static function create($name, $abbr, $facultyID) {
+        $sql = "SELECT `CreateSubject`(:faculty, :name, :abbr) AS `Num`";
+        $res = DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':faculty' => $facultyID,
+                ':name'    => trim($name),
+                ':abbr'    => trim($abbr),
+            ])->execute();
 
-        return $list;
+        return (int) $res->get('Num');
     }
 }
diff --git a/~dev_rating/application/classes/Model/System.php b/~dev_rating/application/classes/Model/System.php
index 4b43e4213ce3bd2d6f2a94c380af4075ea9454fe..ef71101240f5c7b60792a162ff758a29d7fa4e69 100644
--- a/~dev_rating/application/classes/Model/System.php
+++ b/~dev_rating/application/classes/Model/System.php
@@ -1,12 +1,61 @@
 <?php defined('SYSPATH') or die('No direct script access.');
-  
+
 class Model_System extends Model
 {
-    public function getBitmaskForRoute($routeName)
-    {
-        $db = Database::instance();
-        $routeName = $db->escape($routeName);
-        $sql = "SELECT `GetBitmaskByPagename`($routeName) AS `Bitmask`; ";
-        return DB::query(Database::SELECT, $sql)->execute()->get('Bitmask');
+    protected static $configs = [];
+
+    public static $SemesterID;
+
+    // load json-config from app/config/ dir
+    public static function loadConfig($name) {
+        if (array_key_exists($name, self::$configs)) {
+            return self::$configs[$name];
+        } else {
+            $data = file_get_contents(APPPATH . 'config' . DIRECTORY_SEPARATOR . $name);
+            $data = self::json_clean_decode($data);
+            self::$configs[$name] = $data;
+            return $data;
+        }
+    }
+
+    public static function saveConfig($name) {
+        // Not implemented yet
+    }
+
+
+    public static function getChangeLog() {
+        $file = APPPATH . 'updates.md';
+        $source = file_exists($file) ? file_get_contents($file) : '';
+        $blocks = preg_split("/[\r\n]*---[-]*[\r\n]*/", $source);
+
+        $log = [];
+        foreach ($blocks as $row) {
+            $log[] = [
+                'date' => substr($row, 0, strpos($row, PHP_EOL)),
+                'text' => trim(substr($row, strpos($row, PHP_EOL))),
+            ];
+        }
+
+        return $log;
+    }
+
+
+    /**
+     * Clean comments of json content and decode it with json_decode().
+     * Work like the original php json_decode() function with the same params
+     *
+     * @param   string  $json    The json string being decoded
+     * @param   bool    $assoc   When TRUE, returned objects will be converted into associative arrays.
+     * @param   integer $depth   User specified recursion depth. (>=5.3)
+     * @param   integer $options Bitmask of JSON decode options. (>=5.4)
+     * @return  mixed
+     */
+    private static function json_clean_decode($json, $assoc = false, $depth = 512, $options = 0) {
+        // search and remove comments like /* */ and //
+        $json = preg_replace("#(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|([\s\t]//.*)|(^//.*)#", '', $json);
+
+        return json_decode($json, $assoc, $depth, $options);
     }
 }
+
+Model_System::$SemesterID = Model_System::loadConfig('general.json')->SemesterID;
diff --git a/~dev_rating/application/classes/Model/Teacher.php b/~dev_rating/application/classes/Model/Teacher.php
index 0ea9ec628ed46a7ec96dfbbd15d16b2f5b958b73..9b34bc1e19c67e22b981efa578b1c4a68726ae87 100644
--- a/~dev_rating/application/classes/Model/Teacher.php
+++ b/~dev_rating/application/classes/Model/Teacher.php
@@ -1,5 +1,62 @@
 <?php defined('SYSPATH') or die('No direct script access.');
-  
+
 class Model_Teacher extends Model
 {
+    public $ID;
+
+    public static function with($id) {
+        //fixme: teacher may not exist
+        if (!is_numeric($id) || $id <= 0)
+            throw new LogicException(Error::ID_IS_INCORRECT);
+
+        $t = new self();
+        $t->ID = (int) $id;
+        return $t;
+    }
+
+
+    public function changeInfo($lastName, $firstName, $secondName, $degreeID, $departmentID) {
+        $sql = "SELECT `ChangeTeacherInfo`(:id, :last, :first, :second, :degree, :department) AS `Num`";
+        $res = DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':id'         => $this->ID,
+                ':last'       => $lastName,
+                ':first'      => $firstName,
+                ':second'     => $secondName,
+                ':degree'     => $degreeID,
+                ':department' => $departmentID,
+            ])->execute()->get('Num');
+        return ($res == 0);
+    }
+
+    /** @return Model_Discipline[] */
+    public function getDisciplines() {
+        $semesterID = User::instance()->SemesterID;
+        $sql = "CALL `GetDisciplinesForTeacher`(:id, :semesterID)";
+        $query = DB::query(Database::SELECT, $sql)
+            ->param(':semesterID', $semesterID)
+            ->param(':id', $this->ID)
+            ->execute();
+
+        $list = [];
+        foreach ($query as $data)
+            $list[] = new Model_Discipline($data, true);
+
+        return $list;
+    }
+
+    /**
+     * Get edit rights for discipline.
+     * @param $discipline Model_Discipline
+     * @return int  1 if teacher is bound to discipline,
+     *                    0 if he is from a dean office,
+     *                    -1 otherwise.
+     */
+    public function getRightsForDiscipline(Model_Discipline $discipline) {
+        $sql = "SELECT `GetEditRightsForTeacher`(:teacher, :discipline) AS `Num`";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':discipline', $discipline->ID)
+            ->param(':teacher', $this->ID)
+            ->execute()->get('Num');
+    }
 }
diff --git a/~dev_rating/application/classes/Model/Teachers.php b/~dev_rating/application/classes/Model/Teachers.php
index 734e1db28761eeb8071576f7f897af1c0499b56a..01aa19dba6f99e94195ae7a77e1c0b4b1b521557 100644
--- a/~dev_rating/application/classes/Model/Teachers.php
+++ b/~dev_rating/application/classes/Model/Teachers.php
@@ -3,22 +3,24 @@
 class Model_Teachers extends Model
 {
     public static function getFaculties() {
-        $sql = "CALL `GetFaculties`(); ";
-        return DB::query(Database::SELECT, $sql)->execute();
+        $sql = "CALL `GetFaculties`()";
+        return DB::query(Database::SELECT, $sql)->execute()->as_array();
     }
 
     public static function getJobPositions() {
-        $sql = "CALL `GetJobPositions`(); ";
-        return DB::query(Database::SELECT, $sql)->execute();
+        $sql = "CALL `GetJobPositions`()";
+        return DB::query(Database::SELECT, $sql)->execute()->as_array();
     }
 
     public function getTeachersByFaculty($facultyID) {
-        $sql = "CALL `GetTeachersByFaculty`('$facultyID'); ";
-        return DB::query(Database::SELECT, $sql)->execute();
+        $sql = "CALL `GetTeachersByFaculty`(:faculty)";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':faculty', $facultyID)
+            ->execute();
     }
 
     public static function byFaculty($facultyID) {
-        $list = array();
+        $list = [];
 
         if ($facultyID > 0) {
             $teachers = self::getTeachersByFaculty($facultyID);
@@ -34,13 +36,15 @@ class Model_Teachers extends Model
     }
 
     public static function getTeachersByDepartment($departmentID) {
-        $sql = "CALL `GetTeachersByDepartment`('$departmentID'); ";
-        return DB::query(Database::SELECT, $sql)->execute();
+        $sql = "CALL `GetTeachersByDepartment`(:id)";
+        return DB::query(Database::SELECT, $sql)
+            ->param(':id', $departmentID)
+            ->execute();
     }
 
     public static function byDepartment($departmentID) {
         $teachers = self::getTeachersByDepartment($departmentID);
-        $list = array();
+        $list = [];
 
         foreach ($teachers as $row) {
             $row['DepartmentName'] = $row['DepName'];
@@ -50,18 +54,9 @@ class Model_Teachers extends Model
         return $list;
     }
 
-    /**
-     * @param $id int discipline id
-     * @return Database_Result select from <tt>view_disciplines_teachers</tt> table
-     */
-    public static function ofDiscipline($id) {
-        $sql = "CALL `GetTeachersForDiscipline`('$id'); ";
-        return DB::query(Database::SELECT, $sql)->execute();
-    }
-
     public static function getNamesForDiscipline($disciplineID, $asConcat = false, $asAbbreviation = false) {
-        $teachers = self::ofDiscipline($disciplineID);
-        $list = array();
+        $teachers = Model_Discipline::load($disciplineID)->getTeachers();
+        $list = [];
 
         foreach ($teachers as $row) {
             if ($asAbbreviation) {
@@ -71,7 +66,7 @@ class Model_Teachers extends Model
             }
 
             if ($asConcat)
-                $list[] = $row['LastName'] .' '. $row['FirstName'] .' '. $row['SecondName'];
+                $list[] = $row['LastName'] . ' ' . $row['FirstName'] . ' ' . $row['SecondName'];
             else
                 $list[] = $row;
         }
@@ -79,21 +74,28 @@ class Model_Teachers extends Model
         return $list;
     }
 
-    public static function searchTeachers($FacultyID, $DepartmentID, $Last, $First, $Second) {
-        $db = Database::instance();
-        $Last = $db->escape($Last);
-        $Second = $db->escape($Second);
-        $First = $db->escape($First);
-        $sql = "CALL `SearchTeachers`('$FacultyID', '$DepartmentID', $Last, $First, $Second); ";
-        return DB::query(Database::SELECT, $sql)->execute();
+    public static function searchTeachers($facultyID, $departmentID, $last, $first, $second) {
+        $sql = "CALL `SearchTeachers`(:faculty, :department, :last, :first, :second)";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':faculty'    => $facultyID,
+                ':department' => $departmentID,
+                ':last'       => $last,
+                ':first'      => $first,
+                ':second'     => $second,
+            ])->execute();
     }
 
-    public static function searchTeacherNew($FacultyID, $DepartmentID, $Last, $First, $Second, $DisciplineID) {
-        $db = Database::instance();
-        $Last = $db->escape($Last);
-        $Second = $db->escape($Second);
-        $First = $db->escape($First);
-        $sql = "CALL `SearchTeacherNew`('$FacultyID', '$DepartmentID', $Last, $First, $Second, '$DisciplineID'); ";
-        return DB::query(Database::SELECT, $sql)->execute();
+    public static function searchTeacherNew($facultyID, $departmentID, $last, $first, $second, $disciplineID) {
+        $sql = "CALL `SearchTeacherNew`(:faculty, :department, :last, :first, :second, :discipline)";
+        return DB::query(Database::SELECT, $sql)
+            ->parameters([
+                ':faculty'    => $facultyID,
+                ':department' => $departmentID,
+                ':discipline' => $disciplineID,
+                ':last'       => $last,
+                ':first'      => $first,
+                ':second'     => $second,
+            ])->execute();
     }
 }
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Model/User/Student.php b/~dev_rating/application/classes/Model/User/Student.php
new file mode 100644
index 0000000000000000000000000000000000000000..229b41b9cde3e1518f41072869f080d97385b091
--- /dev/null
+++ b/~dev_rating/application/classes/Model/User/Student.php
@@ -0,0 +1,18 @@
+<?php
+
+/**
+ * @property $StudentID int
+ * @property $GradeID   int
+ * @property $GradeNum  int
+ * @property $GroupID   int
+ * @property $GroupNum  int
+ * @property $GroupName string
+ * @property $Degree    int
+ * @property $SpecID    int
+ * @property $SpecName  string
+ * @property $SpecAbbr  string
+ */
+class Model_User_Student extends User
+{
+
+}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Model/User/Teacher.php b/~dev_rating/application/classes/Model/User/Teacher.php
new file mode 100644
index 0000000000000000000000000000000000000000..9cab43c96b1ddc73f26f10b3032483fb2ed0842d
--- /dev/null
+++ b/~dev_rating/application/classes/Model/User/Teacher.php
@@ -0,0 +1,12 @@
+<?php
+
+/**
+ * @property $TeacherID int
+ * @property $DepID int
+ * @property $DepName string
+ * @property $JobPositionName string
+ */
+class Model_User_Teacher extends User
+{
+
+}
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Model/errMessages.php b/~dev_rating/application/classes/Model/errMessages.php
deleted file mode 100644
index 51d46d930484cada3481a6194640155cbe52c19a..0000000000000000000000000000000000000000
--- a/~dev_rating/application/classes/Model/errMessages.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-  
-class Model_errMessages extends Model
-{
-
-    public function getRequests($accID)
-    {
-        $sql = "CALL `GetRequests`('0','1000','$accID','all'); ";
-        return DB::query(Database::SELECT, $sql)->execute();    	
-    }
-
-    public function newRequest($accID, $title, $description)
-    {
-        $db = Database::instance();
-        $description = $db->escape($description);
-        $title = $db->escape($title);
-        $sql = "SELECT `CreateRequest`('$accID', $title, $description) AS 'Num'; ";
-        return DB::query(Database::SELECT, $sql)->execute();    	
-    }
-
-}
diff --git a/~dev_rating/application/classes/RusLang.php b/~dev_rating/application/classes/RusLang.php
index 709ba26e5aafefb9fd279d6652081f1f57dcc526..4289741555fbe05eaa73110c548a9ae58bc31e06 100644
--- a/~dev_rating/application/classes/RusLang.php
+++ b/~dev_rating/application/classes/RusLang.php
@@ -1,24 +1,50 @@
 <?php
 
-class RusLang {
-    public static function getNumEnding($number, $endingArray)
-    {
-        if($number == 0) return $endingArray[2];
-        $number = $number % 100;
-        if ($number >= 11 && $number <= 19) {
-            $ending = $endingArray[2];
-        }
-        else {
-            $i = $number % 10;
-            switch ($i)
-            {
-                case (1): $ending = $endingArray[0]; break;
-                case (2):
-                case (3):
-                case (4): $ending = $endingArray[1]; break;
-                default: $ending = $endingArray[2];
-            }
-        }
-        return $ending;
+class RusLang implements ArrayAccess
+{
+    /**
+     *   echo plural_form(42, array('арбуз', 'арбуза', 'арбузов'));
+     */
+    public static function getNumEnding($n, $forms) {
+        return $n % 10 == 1 && $n % 100 != 11 ?
+            $forms[0]
+            : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20)
+                ? $forms[1]
+                : $forms[2]);
     }
+
+    private static $arr = [
+        'bachelor'   => 'Бакалавриат',
+        'specialist' => 'Специалитет',
+        'master'     => 'Магистратура',
+
+        'disciplinary_coursework' => 'Курсовая',
+        'scientific_coursework'   => 'Курсовая',
+
+        'exam'           => 'Экзамен',
+        'credit'         => 'Зачет',
+        'grading_credit' => 'Дифф. зачет',
+
+        'autumn' => 'Осень',
+        'spring' => 'Весна',
+    ];
+
+    /**
+     * Translate tool.
+     * @param $string string
+     * @return string
+     * todo: i18n extension 4 twig
+     */
+    public static function tr($string) {
+        return isset(self::$arr[$string]) ? self::$arr[$string] : $string;
+    }
+
+
+    public function offsetGet($offset) { return self::tr($offset); }
+
+    public function offsetExists($offset) { return true; }
+
+    public function offsetSet($offset, $value) { }
+
+    public function offsetUnset($offset) { }
 }
\ No newline at end of file
diff --git a/~dev_rating/application/classes/Twig.php b/~dev_rating/application/classes/Twig.php
index e940cda8a0d0dca2e8a784fe2174e67dd84e45f3..d153150097250d95a95610324a52e55a1b795610 100644
--- a/~dev_rating/application/classes/Twig.php
+++ b/~dev_rating/application/classes/Twig.php
@@ -1,18 +1,33 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
+/**
+ * Class Twig
+ *
+ * @property $HTML HTML
+ * @property $Date Date
+ * @property $URL URL
+ * @property $UTF8 UTF8
+ * @property $Text Text
+ * @property $Rus RusLang
+ * @property $Arr Arr
+ * @property $Inflector Inflector
+ * @property $System array[]
+ */
 class Twig extends Kohana_Twig
 {
     public static function factory($file = NULL, array $data = NULL) {
         $twig = parent::factory($file, $data);
-        $twig->HTML = new HTML;
-        $twig->Date = new Date;
-        $twig->URL = new URL;
-        $twig->UTF8 = new UTF8;
-        $twig->Text = new Text;
-        $twig->Rus = new RusLang;
-        $twig->Arr = new Arr;
-        $twig->Inflector = new Inflector;
-        $twig->System = array('Title' => ASSEMBLY_SYSTEM_NAME, 'Version' => ASSEMBLY_VERSION);
+        $twig->set_global([
+            'HTML' => new HTML,
+            'Date' => new Date,
+            'URL' => new URL,
+            'UTF8' => new UTF8,
+            'Text' => new Text,
+            'Rus' => new RusLang,
+            'Arr' => new Arr,
+            'Inflector' => new Inflector,
+            'System' => array('Title' => ASSEMBLY_SYSTEM_NAME, 'Version' => ASSEMBLY_VERSION),
+        ]);
         return $twig;
     }
 }
\ No newline at end of file
diff --git a/~dev_rating/modules/account/classes/Kohana/User.php b/~dev_rating/application/classes/User.php
similarity index 54%
rename from ~dev_rating/modules/account/classes/Kohana/User.php
rename to ~dev_rating/application/classes/User.php
index 399673809fc5d269f8ff75ac95a1a447dfc15d33..f086804bb58720eace809897689a6e0f9eb355b5 100644
--- a/~dev_rating/modules/account/classes/Kohana/User.php
+++ b/~dev_rating/application/classes/User.php
@@ -28,21 +28,38 @@
  * @property-read $PasswordHash string
  * @property-read $start_time int
  */
-class Kohana_User implements ArrayAccess
+class User implements ArrayAccess
 {
-    protected static $_instance;
+    const RIGHTS_AUTHORIZED = -2;  // no guests
+    const RIGHTS_ANYBODY = 1;      // guests too
+    const RIGHTS_STUDENT = 2;
+    const RIGHTS_TEACHER = 4;
+    const RIGHTS_ADMIN = 8;
+    const RIGHTS_DEAN = 16;
+
+
+    /** @var Session */
     protected $_session;
+
+    /** @var Kohana_Config_Group */
     protected $_config;
-    protected $_model;
-    protected $_userInfo;
-    protected static $_flag;
+
+    protected $_general;
+
+    /** @var  bool responsible for renewal of session lifetime (see instance() )  */
+    protected static $_updateSession;
+
+    /** @var  self */
+    protected static $_instance;
+
 
     /**
-     * todo: mark deprecated as singleton is an anti-pattern!
+     * todo: mark as deprecated cause singleton is an anti-pattern!
+     * @param bool $updateSession set false, if session lifetime shouldn't be renewed
      * @return self class instance (singleton-pattern)
      */
-    public static function instance($state = false) {
-        self::$_flag = $state;
+    public static function instance($updateSession = true) {
+        self::$_updateSession = $updateSession;
         if (!isset(self::$_instance)) {
             $config = Kohana::$config->load('account');
             self::$_instance = new self($config);
@@ -51,41 +68,52 @@ class Kohana_User implements ArrayAccess
     }
 
 
-    private function __construct($config = array()) {
+    private function __construct($config = []) {
         $this->_config = $config;
-        $this->_session = Session::instance();
+        $this->_general = Model_System::loadConfig("general.json");
 
-        $this->_model = new Model_Account;
-        $this->_config['hash_key'] = $this->_model->getHashKey();
+        $this->_config['hash_key'] = $this->_general->HashKey;
         $this->_config['hash_method'] = 'sha256';
-        $isSignedIn = $this->isSignedIn();
-        $this->_PrepareSemester();
 
-        if ($isSignedIn) {
-            $id = $this->_session->get('ID');
-            $this->_userInfo = $this->_getInfoFromDB($id);
+        $session = $this->_session = Session::instance();
 
-            if (self::$_flag != true) {
-                $this->_session->regenerate();
-                $this->_session->set('start_time', time());
-            }
+        if ( !isset($session->RoleMark) )
+            $session->RoleMark = 1;
+
+        if ( self::$_updateSession ) {
+            $session->regenerate();
+            $session->set('start_time', time());
         }
     }
 
 
-    protected function _PrepareSemester() {
-        $semesterID = $this->_session->get("SemesterID");
-        if (!$semesterID) {
-            $semesterID = $this->_model->GetCurSemesterID();
-        }
-        $this->SetSemester($semesterID);
+    /**
+     * @param $mask
+     * @throws LogicException
+     */
+    public function checkAccess($mask) {
+        $goodBoy = $this->RoleMark & $mask;
+        if (!$goodBoy) throw new LogicException(Error::ACCESS_DENIED);
     }
 
-    public function SetSemester($semesterID) {
-        $res = $this->_model->SetSemesterID($semesterID);
-        if ($res >= 0) {
-            $this->_session->set("SemesterID", "$semesterID");
-        }
+    public function isDean() {
+        return (bool) ($this->RoleMark & self::RIGHTS_DEAN);
+    }
+
+    public function isAdmin() {
+        return (bool) ($this->RoleMark & self::RIGHTS_ADMIN);
+    }
+
+    public function isTeacher() {
+        return (bool) ($this->RoleMark & self::RIGHTS_TEACHER);
+    }
+
+    public function isStudent() {
+        return (bool) ($this->RoleMark & self::RIGHTS_DEAN);
+    }
+
+    public function isAuthorized() {
+        return (bool) ($this->RoleMark & ~self::RIGHTS_ANYBODY);
     }
 
 
@@ -95,34 +123,26 @@ class Kohana_User implements ArrayAccess
      * аккаунтов с такими же авторизационными данными.
      *
      * @param string $code   Код активации
-     * @param string $email  E-Mail адресс
+     * @param string $email  E-Mail адрес
      * @param string $login
      * @param string $password
      * @return array  Пару вида <tt>(is_ok, err_msg)</tt>
      */
     public function signUp($code, $email, $login, $password) {
-        $model = &$this->_model;
-        $account = Account::instance();
-
-        $isValid = $model->isActivationCodeValid($code);
-        if (!$isValid) {
-            return array(false, 'invalid_code');
+        $id = Model_Account::activateAccount($login, $password, $email, $code);
+        switch ($id) {
+            case -1:
+                return [false, 'something wrong!'];
+            case -2:
+                return [false, 'invalid_code'];
+            case -3:
+                return [false, 'mail_exists'];
+            case -4:
+                return [false, 'login_exists'];
         }
 
-        $isLogin = $account->isLoginExists($login);
-        $isMail = $account->isMailExists($email);
-
-        if ($isLogin) {
-            return array(false, 'login_exists');
-        } else {
-            if ($isMail) {
-                return array(false, 'mail_exists');
-            }
-        }
-
-        $id = $model->activateAccount($login, $password, $email, $code);
         $this->completeSignIn($id, $this->hash($password));
-        return array(true, 'ok');
+        return [true, 'ok'];
     }
 
     /**
@@ -134,26 +154,33 @@ class Kohana_User implements ArrayAccess
      * и false, если данные являются некорректными.
      */
     public function signIn($login, $password) {
-        $id = (int)$this->_model->checkAuth($login, $password);
-        if ($id === -1) {
-            return false;
-        } else {
-            return $this->completeSignIn($id, $this->hash($password));
-        }
+        $id = (int)Model_Account::checkAuth($login, $password);
+        return $this->completeSignIn($id, $this->hash($password));
     }
 
-    protected function completeSignIn($id, $passhash) {
+    protected function completeSignIn($id, $passHash)
+    {
+        if ( $id <= 0 )
+            return false;
+
         $source = $id . Request::$user_agent . Request::$client_ip;
         $userHash = $this->hash($source) . $this->_config['hash_key'];
-        $passwordHash = $this->hash($passhash . $this->_config['hash_key']);
+        $passwordHash = $this->hash($passHash . $this->_config['hash_key']);
         Cookie::set('userhash', $passwordHash);
-        $this->_userInfo = $this->_getInfoFromDB($id);
-        $this->_session->regenerate();
-        $this->_session->set('ID', $id);
-        $this->_session->set('LoggedIn', true);
-        $this->_session->set('UserHash', $this->hash($userHash));
-        $this->_session->set('PasswordHash', $passwordHash);
-        $this->_session->set('start_time', time());
+        $userInfo = Model_Account::getUserInfo($id, $this->_general->SemesterID);
+
+        $session = $this->_session;
+        $session->regenerate();
+        $session->set('ID', $id);
+        $session->set('SemesterID', $this->_general->SemesterID);
+        $session->set('LoggedIn', true);
+        $session->set('UserHash', $this->hash($userHash));
+        $session->set('PasswordHash', $passwordHash);
+        $session->set('start_time', time());
+        foreach($userInfo as $key => $value) {
+            $session->set($key, $value);
+        }
+
         return true;
     }
 
@@ -165,8 +192,7 @@ class Kohana_User implements ArrayAccess
      * @return bool  true, если пользователь авторизован
      */
     public function isSignedIn() {
-        $session = &$this->_session;
-        if ($session->get('LoggedIn') && !$this->checkHash()) {
+        if ($this->_session->get('LoggedIn') && !$this->checkHash()) {
             $this->completeSignOut();
         }
         return $this->_session->get('LoggedIn');
@@ -199,7 +225,6 @@ class Kohana_User implements ArrayAccess
             ->set('UserHash', false);
 
         Cookie::delete('userhash');
-        unset($this->_userInfo);
         $this->_session->restart();
         return true;
     }
@@ -223,45 +248,62 @@ class Kohana_User implements ArrayAccess
         if (!$this->checkPassword($old))
             return false;
 
-        $this->_model->changePassword($this->offsetGet('ID'), $new);
-        $passhash = $this->hash($this->hash($new) . $this->_config['hash_key']);
-        $this->_session->set('PasswordHash', $passhash);
-        Cookie::set('userhash', $passhash);
-        return true;
+        $res = (int)Model_Account::changeAccountData($this->ID, $new, 'password');
+        if ($res === 0) {
+            $passHash = $this->hash($this->hash($new) . $this->_config['hash_key']);
+            $this->_session->set('PasswordHash', $passHash);
+            Cookie::set('userhash', $passHash);
+        }
+        return ( $res === 0 );
     }
 
     public function changeLogin($login) {
-        if (!$this->isSignedIn() || Account::instance()->isLoginExists($login))
+        if (!$this->isSignedIn())
             return false;
 
-        $this->_model->changeLogin($this->offsetGet('ID'), $login);
-        return true;
+        $res = (int)Model_Account::changeAccountData($this->ID, $login, 'login');
+        if ( $res === 0 ) {
+            $this->Login = $login;
+            return true;
+        }
+        return false;
     }
 
     public function changeMail($email) {
-        if (!$this->isSignedIn() || Account::instance()->isMailExists($email))
+        if (!$this->isSignedIn() || Account::isMailValid($email))
             return false;
 
-        $token = md5(time() . $this->offsetGet('EMail') . $email);
+        $token = md5(time() . $this->EMail . $email);
         $this->_session->set('NewMail_Token', $token);
         $this->_session->set('NewMail_Adress', $email);
         return $token;
     }
 
-    public function completeChangeMail($token) {
-        $email = $this->_session->get('NewMail_Adress');
-        if ($token == $this->_session->get('NewMail_Token') AND !Account::instance()->isMailExists($email)) {
-            $this->_model->changeMail($this->offsetGet('ID'), $email);
-            return true;
-        } else {
-            return false;
-        }
-    }
+//  # TODO: check don't used
+//    public function completeChangeMail($token) {
+//        $email = $this->_session->get('NewMail_Adress');
+//        $sessionToken = $this->_session->get('NewMail_Token');
+//        if ( !$this->isSignedIn() || $token == $sessionToken )
+//            return false;
+//
+//        $res = (int)Model_Account::changeAccountData($this->ID, $email, 'email');
+//        return ( $res === 0 );
+//    }
 
     public function changeProfile($data) {
-        if ($this->offsetGet('Type') == 'teacher') {
-            $this->_model->ChangeTeacherInfo($this->offsetGet('TeacherID'), $data['lastName'], $data['firstName'], $data['secondName'], $data['jobPositionID'], $data['departmentID']);
+        if ($this->Type != 'teacher')
+            return false;
+
+        $res = Model_Teacher::with($this['TeacherID'])->changeInfo(
+            $data['lastName'], $data['firstName'], $data['secondName'],
+            $data['jobPositionID'], $data['departmentID']
+        );
+        if ( $res ) {
+            $this->LastName = $data['lastName'];
+            $this->FirstName = $data['firstName'];
+            $this->SecondName = $data['secondName'];
         }
+        return $res;
     }
 
     /* Info */
@@ -273,18 +315,12 @@ class Kohana_User implements ArrayAccess
      */
     public function toArray() {
         if ($this->isSignedIn()) {
-            return $this->_userInfo + $this->_session->as_array();
-            // fixme: nobody knows what _session contains!
+            return $this->_session->as_array();
         } else {
-            return array();
+            return [];
         }
     }
 
-    protected function _getInfoFromDB($id) {
-        $info = $this->_model->getPersonalInfo($id);
-        $info += $this->_model->getAccountInfo($id);
-        return $info;
-    }
 
     /* Fields access */
 
@@ -297,29 +333,22 @@ class Kohana_User implements ArrayAccess
     }
 
     public function offsetSet($offset, $value) {
-        if (isset($this->_userInfo[$offset])) {
-            return $this->_userInfo[$offset];
-        } else {
-            throw new Kohana_Exception('Invalid key: ' . $offset);
-        }
+        $this->_session[$offset] = $value;
     }
 
     public function offsetGet($offset) {
-        if (isset($this->_userInfo[$offset])) {
-            return $this->_userInfo[$offset];
-        } else {
-            return $this->_session->get($offset);
-        }
+        if (isset($offset, $this->_session))
+            return $this->_session[$offset];
+
+        throw new ErrorException('No such field');
     }
 
     public function offsetUnset($offset) {
-        if (isset($this->_userInfo[$offset])) {
-            unset($this->_userInfo[$offset]);
-        }
+        unset($this->_session[$offset]);
     }
 
     public function offsetExists($offset) {
-        return isset($this->_userInfo[$offset]);
+        return isset($this->_session[$offset]);
     }
 
     /**
@@ -331,7 +360,8 @@ class Kohana_User implements ArrayAccess
     protected function hash($str) {
         if (!$this->_config['hash_key']) {
             $this->_config['hash_key'] = $key = md5(time() . Request::$client_ip);
-            $this->_model->setHashKey($key);
+            # TODO: implement
+            Model_Account::setHashKey($key);
         }
         return hash_hmac($this->_config['hash_method'], $str, $this->_config['hash_key']);
     }
diff --git a/~dev_rating/application/routes/api.php b/~dev_rating/application/routes/api.php
new file mode 100644
index 0000000000000000000000000000000000000000..a4b1a2658e00cbab322755caaab5302dc5bf29d1
--- /dev/null
+++ b/~dev_rating/application/routes/api.php
@@ -0,0 +1,14 @@
+<?php
+
+//// the most common routes
+//Route::set('api:getById', 'api/<controller>/<id>', ['id' => '\d+'])
+//    ->defaults([
+//        'action'    => 'index',
+//        'directory' => 'api',
+//    ]);
+//
+//Route::set('api:common', 'api/<controller>(/<action>(/<id>))', ['id' => '\d+'])
+//    ->defaults([
+//        'action'    => 'index',
+//        'directory' => 'api',
+//    ]);
\ No newline at end of file
diff --git a/~dev_rating/application/routes/dean_office.php b/~dev_rating/application/routes/dean_office.php
new file mode 100644
index 0000000000000000000000000000000000000000..b3b43c758db019279de32232a55de1273e4385b3
--- /dev/null
+++ b/~dev_rating/application/routes/dean_office.php
@@ -0,0 +1,25 @@
+<?php
+
+// list students
+Route::set('dean:students:list', 'dean_office/students(/)')
+    ->defaults(array(
+        'directory' => 'deanOffice',
+        'controller' => 'students',
+        'action' => 'index',
+    ));
+
+// profile of student
+Route::set('dean:students:profile', 'dean_office/students(/<id>)', ['id' => '\d+'])
+    ->defaults(array(
+        'directory' => 'deanOffice',
+        'controller' => 'students',
+        'action' => 'profile',
+    ));
+
+// the most common route
+Route::set('dean_office:index', 'dean_office(/<controller>(/<action>(/<param1>(:<param2>))))')
+    ->defaults(array(
+        'directory' => 'deanOffice',
+        'controller' => 'sheets',
+        'action' => 'index',
+    ));
diff --git a/~dev_rating/application/tests/classes/Model_Discipline_Test.php b/~dev_rating/application/tests/classes/Model_Discipline_Test.php
new file mode 100644
index 0000000000000000000000000000000000000000..7678ec5a3e7474440563c5b64d7f431555e157b5
--- /dev/null
+++ b/~dev_rating/application/tests/classes/Model_Discipline_Test.php
@@ -0,0 +1,11 @@
+<?php
+
+class Model_Discipline_Test extends PHPUnit_Framework_TestCase {
+
+    /** @test */
+    function idField() {
+        $d = Model_Discipline::load(1);
+        $this->assertEquals($d->id, 1);
+    }
+
+}
diff --git a/~dev_rating/application/updates.md b/~dev_rating/application/updates.md
new file mode 100644
index 0000000000000000000000000000000000000000..eb98de7c2fbd2a974599db8a9d247506577393ae
--- /dev/null
+++ b/~dev_rating/application/updates.md
@@ -0,0 +1,64 @@
+п»ї11.06.15
+
+1. Новые ведомости формируются для каждого этапа отдельно
+
+---
+
+25.05.15
+
+1. Добавлен тип дисциплины дифференцированный зачет (зачет с оценкой)
+2. Добавлено создание курсовых работ в виде дисциплин
+3. Изменены печатные формы аттестационных ведомостей
+
+---
+
+03.04.15
+
+1. Исправлена функция восстановления пароля. Теперь письма на mail.ru и другие почтовые сервисы успешно доставляются.
+
+---
+
+05.03.15
+
+1. Устранена уязвимость в безопасности системы
+
+---
+
+08.02.15
+
+1. Добавлено ведение дисциплин по семестрам
+2. Добавлена возможность указать неявку и экзамен автоматом (при 60 баллах)
+3. Исправлен механизм добора баллов
+4. Обновлен интерфейс
+
+---
+
+30.12.14
+
+1. Добавлен интерфейс деканата
+2. Добавлена возможность формировать ведомости по всем дисциплинам (зачет) группы
+
+---
+
+22.12.14
+
+1. В интерфейсе преподавателей добавлена страница "Сессия" (ссылка на нее находится на странице "Оценивание")
+2. Добавлена возможность печати ведомости в формате Excel (на странице "Сессия")
+
+---
+
+30.11.14
+
+1. Добавлена возможность восстановления пароля;
+2. Добавлен фильтр по группам в оценивании;
+
+---
+
+27.10.14
+
+1. Добавлена возможность удаления дисциплины при отсутствии выставленных баллов;
+2. Реализована передача дисциплины другому преподавателю (в интерфейсе добавления преподавателей к дисциплине);
+3. Заблокирована возможность оценивания, если УКД не включает необходимое количество баллов (100 или 110 с бонусными баллами);
+4. Улучшен внешний вид;
+5. Обновлен иструмент прикрепления студентов к дисциплине;
+6. Частично удалены всплывающие окна, сообщающие об успехе операции;
\ No newline at end of file
diff --git a/~dev_rating/application/updates.txt b/~dev_rating/application/updates.txt
deleted file mode 100644
index e4fc0310c8c51800b41369b501bb17efaa52f057..0000000000000000000000000000000000000000
--- a/~dev_rating/application/updates.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-п»ї25.05.15
-Добавлен тип дисциплины дифференцированный зачет (зачет с оценкой)
-Добавлено создание курсовых работ в виде дисциплин
-Изменены печатные формы аттестационных ведомостей 
\ No newline at end of file
diff --git a/~dev_rating/application/updates_log.txt b/~dev_rating/application/updates_log.txt
deleted file mode 100644
index 53c59ccaad893f657fc2cc62f67001b60f40132a..0000000000000000000000000000000000000000
--- a/~dev_rating/application/updates_log.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-п»ї25.05.15
-Добавлен тип дисциплины дифференцированный зачет (зачет с оценкой)
-Добавлено создание курсовых работ в виде дисциплин
-Изменены печатные формы аттестационных ведомостей 
-
-03.04.15
-Исправлена функция восстановления пароля. Теперь письма на mail.ru и другие почтовые сервисы успешно доставляются.
-
-05.03.15
-Устранена уязвимость в безопасности системы
-
-08.02.15
-Добавлено ведение дисциплин по семестрам
-Добавлена возможность указать неявку и экзамен автоматом (при 60 баллах)
-Исправлен механизм добора баллов
-Обновлен интерфейс
-
-30.12.14
-Добавлен интерфейс деканата
-Добавлена возможность формировать ведомости по всем дисциплинам (зачет) группы
-
-22.12.14
-В интерфейсе преподавателей добавлена страница "Сессия" (ссылка на нее находится на странице "Оценивание")
-Добавлена возможность печати ведомости в формате Excel (на странице "Сессия")
-
-30.11.14
-Добавлена возможность восстановления пароля;
-Добавлен фильтр по группам в оценивании;
-
-27.10.14
-Добавлена возможность удаления дисциплины при отсутствии выставленных баллов;
-Реализована передача дисциплины другому преподавателю (в интерфейсе добавления преподавателей к дисциплине);
-Заблокирована возможность оценивания, если УКД не включает необходимое количество баллов (100 или 110 с бонусными баллами);
-Улучшен внешний вид;
-Обновлен иструмент прикрепления студентов к дисциплине;
-Частично удалены всплывающие окна, сообщающие об успехе операции;
\ No newline at end of file
diff --git a/~dev_rating/application/views/admin/accounts/codes.twig b/~dev_rating/application/views/admin/accounts/codes.twig
index a525488d2a883990684bc507278de108de6732f5..3aff72706fa8b7a35af1266c697546a919111b41 100644
--- a/~dev_rating/application/views/admin/accounts/codes.twig
+++ b/~dev_rating/application/views/admin/accounts/codes.twig
@@ -34,7 +34,7 @@
         </div>
         <div class="step_body">
             <select id="facultySelect">
-                <option value="0">--- Подразделение ЮФУ ---</option>
+                <option value="0">— Подразделение ЮФУ —</option>
                 {% for row in Faculties %}
                 <option value="{{ row.ID }}">{{ row.Name }} ({{ row.Abbr }})</option>
                 {% endfor %}
@@ -47,7 +47,7 @@
         </div>
         <div class="step_body">
             <select id="gradeSelect">
-                <option value="0">--- РљСѓСЂСЃ ---</option>
+                <option value="0">— Курс —</option>
                 {% for Degree in Grades %}
                 <optgroup label="{{ Degree.Title }}">
                     {% for Grade in Degree.Grades %}
diff --git a/~dev_rating/application/views/admin/accounts/index.twig b/~dev_rating/application/views/admin/accounts/index.twig
index 08686022bfc33b5919852649d8458021857e25df..377a06bcd3238ba8142b5faeded380c72e8f1e53 100644
--- a/~dev_rating/application/views/admin/accounts/index.twig
+++ b/~dev_rating/application/views/admin/accounts/index.twig
@@ -9,10 +9,6 @@
 {% block main_top_title %}Управление аккаунтами{% endblock %}
 
 {% block main_content %}
-
-    <div class="">
-        <h1>С‹</h1>
-    </div>
     <div class="action_bar">
     {{ admin.action(URL.site('admin/accounts/getActivationCodes'), URL.site('media/img/codes.png'), 'Получить коды активации',
             'Получить коды активации для неактивированных аккаунтов. '~
diff --git a/~dev_rating/application/views/admin/base.twig b/~dev_rating/application/views/admin/base.twig
index bb81d0d224a235a7bd610dbc34f9914be1924275..ea5cbdc48ff9ed8954d14e06ee74b6f0b85d8700 100644
--- a/~dev_rating/application/views/admin/base.twig
+++ b/~dev_rating/application/views/admin/base.twig
@@ -34,8 +34,8 @@
 	<title>{% block title %}{% endblock %} | Admin - {{ System.Title }}</title>
 	{{ HTML.style('media/css/admin/base.css')|raw }}
 	{{ HTML.style('media/css/admin/macro.css')|raw }}
-    {{ HTML.style('media/css/actionButton.css')|raw }}
-
+    {#{{ HTML.style('media/css/actionButton.css')|raw }}#}
+    {{ HTML.style('media/less/common/buttons.css')|raw }}
 
     {{ HTML.script('media/js/jquery-1.11.1.min.js')|raw }}
     {{ HTML.script('media/js/config.js')|raw }}
diff --git a/~dev_rating/application/views/admin/students/add.twig b/~dev_rating/application/views/admin/students/add.twig
index d9b47261634fdee4ce063f61d99f294b00f9a894..40a1b2a852c6800e3907aa8bea743a4f7bbad812 100644
--- a/~dev_rating/application/views/admin/students/add.twig
+++ b/~dev_rating/application/views/admin/students/add.twig
@@ -37,13 +37,13 @@
         </div>
         <div class="inputGroup_input">
             <select id="facultySelect">
-                <option value="0">--- Подразделение ЮФУ ---</option>
+                <option value="0">— Подразделение ЮФУ —</option>
                 {% for row in Faculties %}
                 <option value="{{ row.ID }}">{{ row.Name }} ({{ row.Abbr }})</option>
                 {% endfor %}
             </select>
             <select id="gradeSelect">
-                <option value="0">--- РљСѓСЂСЃ ---</option>
+                <option value="0">— Курс —</option>
                 {% for Degree in Grades %}
                 <optgroup label="{{ Degree.Title }}">
                     {% for Grade in Degree.Grades %}
@@ -53,7 +53,7 @@
                 {% endfor %}
             </select>
             <select id="groupSelect">
-                <option value="0">--- Учебная группа ---</option>
+                <option value="0">— Учебная группа —</option>
             </select>            
         </div>
     </div>
diff --git a/~dev_rating/application/views/admin/students/index.twig b/~dev_rating/application/views/admin/students/index.twig
index 420eb959d957913ef8551a34d4b056c61d432cce..3de43e198dfa18989c49fb3f28a8f51f6619e7bd 100644
--- a/~dev_rating/application/views/admin/students/index.twig
+++ b/~dev_rating/application/views/admin/students/index.twig
@@ -3,7 +3,6 @@
 {% block media %}
     {{ HTML.style('media/css/admin/searchBox.css')|raw }}
     {{ HTML.script('media/js/admin/students/index.js')|raw }}
-    {{ HTML.script('media/js/common/Studentslist.js')|raw }}
 {% endblock %}
 
 {% block title %}Студенты{% endblock %}
@@ -22,12 +21,12 @@
         <div class='search_box'>
             <div class='search_inputs'>
                 <div class='search_mainInput'>
-                    <input type='text' placeholder="Поиск по фамилии, имени, отчеству">
+                    <input id="studentName" type='text' placeholder="Поиск по фамилии, имени, отчеству">
                 </div>
                 <div class='search_inputFilters'>
                     <div class='filterLarge'>
                         <select id="facultySelect">
-                            <option value="0">--- Подразделение ЮФУ ---</option>
+                            <option value="0">— Подразделение ЮФУ —</option>
                             {% for row in Faculties %}
                             <option value="{{ row.ID }}">{{ row.Name }} ({{ row.Abbr }})</option>
                             {% endfor %}
@@ -35,7 +34,7 @@
                     </div>
                     <div class='filter'>
                         <select id="gradeSelect">
-                            <option value="0">--- РљСѓСЂСЃ ---</option>
+                            <option value="0">— Курс —</option>
                             {% for Degree in Grades %}
                             <optgroup label="{{ Degree.Title }}">
                                 {% for Grade in Degree.Grades %}
@@ -47,7 +46,7 @@
                     </div>
                     <div class='filter'>
                         <select id="groupSelect">
-                            <option value="0">--- Учебная группа ---</option>
+                            <option value="0">— Учебная группа —</option>
                         </select>
                     </div>
                 </div>            
diff --git a/~dev_rating/application/views/admin/students/profile.twig b/~dev_rating/application/views/admin/students/profile.twig
index 64fab11ae85febe9b109e83e4803f049f573299e..c31dbbabd1f595f8710eb7e89d4f187da16fc2bd 100644
--- a/~dev_rating/application/views/admin/students/profile.twig
+++ b/~dev_rating/application/views/admin/students/profile.twig
@@ -23,7 +23,7 @@
         </div>
         <div class="profile_clearFix profile_delimeter">
             <div class="label">РљСѓСЂСЃ, РіСЂСѓРїРїР°:</div>
-            <div class="labeled_info">{{ Profile.Degree }}, {{ Profile.GradeNum }} РєСѓСЂСЃ, {{ Profile.GroupNum }} РіСЂСѓРїРїР°</div>
+            <div class="labeled_info">{{ Rus[Profile.Degree] }}, {{ Profile.GradeNum }} РєСѓСЂСЃ, {{ Profile.GroupNum }} РіСЂСѓРїРїР°</div>
         </div>
         <div class="profile_clearFix">
             <div class="label">Тип аккаунта:</div>
@@ -35,11 +35,11 @@
         </div>
         <div class="profile_clearFix">
             <div class="label">Имя пользователя:</div>
-            <div class="labeled_info">{{ Account.Login|default('---') }}</div>
+            <div class="labeled_info">{{ Account.Login|default('—') }}</div>
         </div>
         <div class="profile_clearFix">
             <div class="label">E-Mail:</div>
-            <div class="labeled_info">{{ Account.EMail|default('---') }}</div>
+            <div class="labeled_info">{{ Account.EMail|default('—') }}</div>
         </div>
     </div>
     <div class="action_bar">
diff --git a/~dev_rating/application/views/admin/students/upload.twig b/~dev_rating/application/views/admin/students/upload.twig
index 4f707715db3d37481a22352225dc819edc25e8f3..abc7b15af7f460d7e9b964515595355590ef9e2a 100644
--- a/~dev_rating/application/views/admin/students/upload.twig
+++ b/~dev_rating/application/views/admin/students/upload.twig
@@ -9,35 +9,41 @@
 {% endblock %}
     
 {% block main_content %}
-    {% if UploadingResult is not empty %}
-        {% set res = '<ul>' %}
-        {% for item in UploadingResult %}
-            {{ res ~ '<li>Строка #' ~ item.Row ~ ': ' ~ item.Info ~ '</li>' }}
-        {% endfor %}
-        {{ admin.message(warning, 'Возникли проблемы!', res ~ '</ul>') }}
+    {% if Errors is not empty %}
+        {% set res %}
+            {% for item in Errors %}
+                <li>Строка #{{ item.Row }}: {{ item.Info }}</li>
+            {% endfor %}
+        {% endset %}
+
+        {{ admin.message(warning, 'Возникли проблемы!', '<ul>' ~ res ~ '</ul>') }}
     {% endif %}
+
     <form enctype="multipart/form-data" action="" method="POST">
-    <div class="stepBox" id="FirstStep">
-        <div class="step_title">
-            <span class='step_title_count'>Шаг 1:</span> <span class='step_title_description'>Выберите подразделение университета</span>
-        </div>
-        <div class="step_body">
-            <select id="facultySelect" name="facultyID">
-                <option value="0">--- Подразделение ЮФУ ---</option>
-                {% for row in Faculties %}
-                <option value="{{ row.ID }}">{{ row.Name }} ({{ row.Abbr }})</option>
-                {% endfor %}
-            </select>
+        <div class="stepBox" id="FirstStep">
+            <div class="step_title">
+                <span class='step_title_count'>Шаг 1:</span>
+                <span class='step_title_description'>Выберите подразделение университета</span>
+            </div>
+            <div class="step_body">
+                <select id="facultySelect" name="facultyID">
+                    <option value="0" selected="selected">— Подразделение ЮФУ —</option>
+                    {% for row in Faculties %}
+                        <option value="{{ row.ID }}">{{ row.Name }} ({{ row.Abbr }})</option>
+                    {% endfor %}
+                </select>
+            </div>
         </div>
-    </div>
-    <div class="stepBox" id="SecondStep">
-        <div class="step_title">
-            <span class='step_title_count'>Шаг 2:</span> <span class='step_title_description'>Выберите файл для загрузки</span>
-        </div>
-        <div class="step_body">
-              <input name="students" type="file">
-              <input type="submit" value="Send">
+
+        <div class="stepBox" id="SecondStep">
+            <div class="step_title">
+                <span class='step_title_count'>Шаг 2:</span>
+                <span class='step_title_description'>Выберите файл для загрузки</span>
+            </div>
+            <div class="step_body">
+                  <input name="students" type="file">
+                  <input type="submit" value="Send">
+            </div>
         </div>
-    </div>
     </form>
 {% endblock %}            
\ No newline at end of file
diff --git a/~dev_rating/application/views/admin/subjects/upload.twig b/~dev_rating/application/views/admin/subjects/upload.twig
index 4eb0bb5a1b701182d99409dc66423b0d3f470151..43bee4971c024466defceb74fc1fc784906a58f8 100644
--- a/~dev_rating/application/views/admin/subjects/upload.twig
+++ b/~dev_rating/application/views/admin/subjects/upload.twig
@@ -9,39 +9,46 @@
 {% endblock %}
     
 {% block main_content %}
-    {% if UploadingResult.Success %}
-        <p>Обработано: {{ UploadingResult.RecordsCount }}, в том числе с ошибками: {{ UploadingResult.ErrorsCount }}, найдены в базе: {{ UploadingResult.RecordsExistsCount }}.</p>
-        {% if UploadingResult.ErrorsCount > 0 %}
-            {% set res = '<ul>' %}
-            {% for item in UploadingResult.Errors %}
-                {{ res ~ '<li>Строка #' ~ item.Row ~ ': ' ~ item.Info ~ '</li>' }}
-            {% endfor %}
+    {% if UploadingResult is not empty %}
+        <p>Обработано: {{ UploadingResult.RecordsCount }}, в том числе с ошибками: {{ UploadingResult.ErrorsCount }},
+            найдены в базе: {{ UploadingResult.RecordsExistsCount }}.</p>
 
-            {{ admin.message(warning, 'Возникли проблемы!', res ~ '</ul>') }}
+        {% if UploadingResult.Errors is not empty %}
+            {% set res %}
+                {% for item in UploadingResult.Errors %}
+                    <li>Строка #{{ item.Row }}: {{ item.Info }}</li>
+                {% endfor %}
+            {% endset %}
+
+            {{ admin.message(warning, 'Возникли проблемы!', res) }}
         {% endif %}
     {% endif %}
+
     <form enctype="multipart/form-data" action="" method="POST">
-    <div class="stepBox" id="FirstStep">
-        <div class="step_title">
-            <span class='step_title_count'>Шаг 1:</span> <span class='step_title_description'>Выберите подразделение университета</span>
+        <div class="stepBox" id="FirstStep">
+            <div class="step_title">
+                <span class='step_title_count'>Шаг 1:</span>
+                <span class='step_title_description'>Выберите подразделение университета</span>
+            </div>
+            <div class="step_body">
+                <select id="facultySelect" name="facultyID">
+                    <option value="0" selected="selected">— Подразделение ЮФУ —</option>
+                    {% for row in Faculties %}
+                        <option value="{{ row.ID }}">{{ row.Name }} ({{ row.Abbr }})</option>
+                    {% endfor %}
+                </select>
+            </div>
         </div>
-        <div class="step_body">
-            <select id="facultySelect" name="facultyID">
-                <option value="0">--- Подразделение ЮФУ ---</option>
-                {% for row in Faculties %}
-                <option value="{{ row.ID }}">{{ row.Name }} ({{ row.Abbr }})</option>
-                {% endfor %}
-            </select>
-        </div>
-    </div>
-    <div class="stepBox" id="SecondStep">
-        <div class="step_title">
-            <span class='step_title_count'>Шаг 2:</span> <span class='step_title_description'>Выберите файл для загрузки</span>
-        </div>
-        <div class="step_body">
-              <input name="subjects" type="file">
-              <input type="submit" value="Send">
+
+        <div class="stepBox" id="SecondStep">
+            <div class="step_title">
+                <span class='step_title_count'>Шаг 2:</span>
+                <span class='step_title_description'>Выберите файл для загрузки</span>
+            </div>
+            <div class="step_body">
+                  <input name="subjects" type="file">
+                  <input type="submit" value="Send">
+            </div>
         </div>
-    </div>
     </form>
 {% endblock %}            
\ No newline at end of file
diff --git a/~dev_rating/application/views/admin/teachers/add.twig b/~dev_rating/application/views/admin/teachers/add.twig
index 952897a1b67e83fbf4db94921c366e43383e5afa..8389ba7572d4a926db482545cb92aa39e4011c42 100644
--- a/~dev_rating/application/views/admin/teachers/add.twig
+++ b/~dev_rating/application/views/admin/teachers/add.twig
@@ -27,19 +27,19 @@
         </div>
         <div class="inputGroup_input">
             <select id="jobPositionSelect">
-                <option value="0">--- Академическая должность ---</option>
+                <option value="0">— Академическая должность —</option>
                 {% for row in JobPositions %}
                 <option value="{{ row.ID }}">{{ row.Name }}</option>
                 {% endfor %}     
             </select>
             <select id="facultySelect">
-                <option value="0">--- Подразделение ЮФУ ---</option>
+                <option value="0">— Подразделение ЮФУ —</option>
                 {% for row in Faculties %}
                 <option value="{{ row.ID }}">{{ row.Name }} ({{ row.Abbr }})</option>
                 {% endfor %}
             </select>
             <select id="departmentSelect">
-                <option value="0">--- Кафедра ---</option>
+                <option value="0">— Кафедра —</option>
             </select>
         </div>
     </div>
diff --git a/~dev_rating/application/views/admin/teachers/handler/listOutput.twig b/~dev_rating/application/views/admin/teachers/handler/listOutput.twig
index e88ce746d05d53fe6e75b7dd0114338a7bcaa08a..157cc13b70a3963e1aabe687677bf9b00972f169 100644
--- a/~dev_rating/application/views/admin/teachers/handler/listOutput.twig
+++ b/~dev_rating/application/views/admin/teachers/handler/listOutput.twig
@@ -12,7 +12,7 @@
         <div class="search_item_info">
             <div class="search_item_firstLine">{{ HTML.anchor('admin/profile/teacher/' ~ row.AccountID, 
                 row.LastName ~  ' ' ~ row.FirstName ~ ' ' ~ row.SecondName)|raw }}</div>
-            <div class="search_item_secondLine">{{ row.JobPositionName }}, {{ row.DepartmentName|default('---') }}</div>
+            <div class="search_item_secondLine">{{ row.JobPositionName }}, {{ row.DepartmentName|default('—') }}</div>
         </div>
         <div class="search_item_actions">
             <a href="#">Редактировать</a>
diff --git a/~dev_rating/application/views/admin/teachers/index.twig b/~dev_rating/application/views/admin/teachers/index.twig
index 2e9a6ee68b3082e12c5b50181b5da9fed73d3d46..e43c2c6e9518a9365de69fc489febb8739c884af 100644
--- a/~dev_rating/application/views/admin/teachers/index.twig
+++ b/~dev_rating/application/views/admin/teachers/index.twig
@@ -9,7 +9,13 @@
 {% block main_top_title %}Управление преподавателями{% endblock %}
 
 {% block main_content %}
-
+    <div class="action_bar">
+        {{ admin.action(URL.site('admin/teachers/add'), URL.site('media/img/addUser.png'), 'Добавить нового преподавателя', 'Добавить в систему '~System.Title~' нового преподавателя. '~
+        'Для него будет создан аккаунт и сгенерирован код активации.') }}
+        {{ admin.action(URL.site('admin/teachers/upload'), URL.site('media/img/uploadList.png'), 'Загрузить список преподавателей',
+        'Загрузить в систему '~System.Title~' список преподавателей из заранее подготовленных csv-файлов. '~
+        'Для каждого преподавателя, загруженного данной утилитой, будет создан аккаунт и сгенерирован код активации.') }}
+    </div>
     <div class='search'>
         <div class='search_box'>
             <div class='search_inputs'>
@@ -19,7 +25,7 @@
                 <div class='search_inputFilters'>
                     <div class='filterLarge'>
                         <select id="facultySelect">
-                            <option value="0">--- Подразделение ЮФУ ---</option>
+                            <option value="0">— Подразделение ЮФУ —</option>
                             {% for row in Faculties %}
                             <option value="{{ row.ID }}">{{ row.Name }} ({{ row.Abbr }})</option>
                             {% endfor %}
@@ -28,7 +34,7 @@
                     
                     <div class='filterLarge'>
                         <select id="departmentSelect">
-                            <option value="0">--- Кафедра ---</option>
+                            <option value="0">— Кафедра —</option>
                         </select>
                     </div>
                 </div>            
@@ -43,11 +49,4 @@
             </div>
         </div>
     </div>
-    <div class="action_bar">
-    {{ admin.action(URL.site('admin/teachers/add'), URL.site('media/img/addUser.png'), 'Добавить нового преподавателя', 'Добавить в систему '~System.Title~' нового преподавателя. '~
-                'Для него будет создан аккаунт и сгенерирован код активации.') }}
-    {{ admin.action(URL.site('admin/teachers/upload'), URL.site('media/img/uploadList.png'), 'Загрузить список преподавателей', 
-                                    'Загрузить в систему '~System.Title~' список преподавателей из заранее подготовленных csv-файлов. '~
-                                    'Для каждого преподавателя, загруженного данной утилитой, будет создан аккаунт и сгенерирован код активации.') }}
-    </div>
 {% endblock %}
\ No newline at end of file
diff --git a/~dev_rating/application/views/admin/teachers/profile.twig b/~dev_rating/application/views/admin/teachers/profile.twig
index 278632cbbe25ab800f876aac1801acf68503dc01..7c0d472b2dd01cc1ad0c1170b690a80d49629fcf 100644
--- a/~dev_rating/application/views/admin/teachers/profile.twig
+++ b/~dev_rating/application/views/admin/teachers/profile.twig
@@ -35,11 +35,11 @@
         </div>
         <div class="profile_clearFix">
             <div class="label">Имя пользователя:</div>
-            <div class="labeled_info">{{ Account.Login|default('---') }}</div>
+            <div class="labeled_info">{{ Account.Login|default('—') }}</div>
         </div>
         <div class="profile_clearFix">
             <div class="label">E-Mail:</div>
-            <div class="labeled_info">{{ Account.EMail|default('---') }}</div>
+            <div class="labeled_info">{{ Account.EMail|default('—') }}</div>
         </div>
     </div>
     <div class="action_bar">
diff --git a/~dev_rating/application/views/admin/teachers/upload.twig b/~dev_rating/application/views/admin/teachers/upload.twig
index 9e3a042ca848faa71258aa1250e5a2bbb82d3514..cd4744053d9fce1367089cf11264d0d8d2785c7b 100644
--- a/~dev_rating/application/views/admin/teachers/upload.twig
+++ b/~dev_rating/application/views/admin/teachers/upload.twig
@@ -9,22 +9,41 @@
 {% endblock %}
     
 {% block main_content %}
-    {% if UploadingResult is not empty %}
-        {% set res = '<ul>' %}
-        {% for item in UploadingResult %}
-            {{ res ~ '<li>Строка #' ~ item.Row ~ ': ' ~ item.Info ~ '</li>' }}
-        {% endfor %}
-        {{ admin.message(warning, 'Возникли проблемы!', res ~ '</ul>') }}
+    {% if Errors is not empty %}
+        {% set res %}
+            {% for item in Errors %}
+                <li>Строка #{{ item.Row }}: {{ item.Info }}</li>
+            {% endfor %}
+        {% endset %}
+
+        {{ admin.message(warning, 'Возникли проблемы!', '<ul>' ~ res ~ '</ul>') }}
     {% endif %}
+
     <form enctype="multipart/form-data" action="" method="POST">
-    <div class="stepBox" id="FirstStep">
-        <div class="step_title">
-            <span class='step_title_count'>Шаг 1:</span> <span class='step_title_description'>Выберите файл для загрузки</span>
+        <div class="stepBox" id="FirstStep">
+            <div class="step_title">
+                <span class='step_title_count'>Шаг 1:</span>
+                <span class='step_title_description'>Выберите подразделение университета</span>
+            </div>
+            <div class="step_body">
+                <select id="facultySelect" name="facultyID">
+                    <option value="0" selected="selected">— Подразделение ЮФУ —</option>
+                    {% for row in Faculties %}
+                        <option value="{{ row.ID }}">{{ row.Name }} ({{ row.Abbr }})</option>
+                    {% endfor %}
+                </select>
+            </div>
         </div>
-        <div class="step_body">
-            <input name="teachers" type="file">
-            <input type="submit" value="Send">
+
+        <div class="stepBox" id="SecondStep">
+            <div class="step_title">
+                <span class='step_title_count'>Шаг 2:</span>
+                <span class='step_title_description'>Выберите файл для загрузки</span>
+            </div>
+            <div class="step_body">
+                  <input name="teachers" type="file">
+                  <input type="submit" value="Send">
+            </div>
         </div>
-    </div>
     </form>
 {% endblock %}            
\ No newline at end of file
diff --git a/~dev_rating/application/views/base.twig b/~dev_rating/application/views/base.twig
index 47c0e4b35e3c2e3a3d838a15f0fdc1ad72fa5b04..3b06a3c4582f0841db544529f54766825332d458 100644
--- a/~dev_rating/application/views/base.twig
+++ b/~dev_rating/application/views/base.twig
@@ -13,8 +13,13 @@
 </a>
 {% endmacro %}
 
-{% macro SemesterSwitcher(CurrentSemester, SemesterList) %}
-	<div class="semesterName"><h2 class="Blue">Семестр: {{ CurrentSemester.Num }} {{ CurrentSemester.Year }}</h2></div>
+{% macro SemesterSwitcher(SemesterList) %}
+	<div class="semesterName">
+        <h2 class="Blue">
+            {% set Semester = SemesterList[User.SemesterID] %}
+            Семестр: {{ Rus[Semester.Season] }} {{ Semester.Num == 1 ? Semester.Year : (Semester.Year + 1) }}
+        </h2>
+    </div>
 	<div class="semesterSwitcherBtn">
 		<a href="#" id="changeSemester" title="Сменить семестр">&#x25BC;</a>
 		<div class="semesterSwitcher" style="display: none;">
@@ -34,7 +39,7 @@
 	<title>{% block title %}{% endblock %} | {{ System.Title }}</title>
 	<meta http-equiv="Cache-Control" content="no-cache">
 	<link href='https://fonts.googleapis.com/css?family=PT+Sans&subset=cyrillic-ext,latin' rel='stylesheet' type='text/css'>
-	{# -------------------------------------------------------------------------------------------------------------- #}
+
 	{{ HTML.style('media/less/common.css')|raw }}
 	{#
 		HTML.style('media/css/messages.css')
@@ -43,7 +48,6 @@
 		HTML.style('media/css/error.css')
 		HTML.style('media/css/global.css')
 	#}
-	{# -------------------------------------------------------------------------------------------------------------- #}
 	{{ HTML.script('media/js/jquery-1.11.1.min.js')|raw }}
 	{{ HTML.script('media/js/config.js')|raw }}
 
@@ -63,7 +67,7 @@
 		HTML.script('media/js/ui/jquery-ui.js')
 		HTML.script('media/js/errDialog.js')
 	#}
-	{# -------------------------------------------------------------------------------------------------------------- #}
+
 	<script>
 		$(function() {
 			$('input, textarea').placeholder();
diff --git a/~dev_rating/application/views/dean_office/base.twig b/~dev_rating/application/views/dean_office/base.twig
index 11d15c59638c6d93d8e665d56add29de3c0bf70e..c37db2ee06e547388e1f81aef9425f9ee06063b2 100644
--- a/~dev_rating/application/views/dean_office/base.twig
+++ b/~dev_rating/application/views/dean_office/base.twig
@@ -11,8 +11,10 @@
 
     <div class="goodClearFix">
         <div class="sidePanel">
-            {{ HTML.anchor('/dean_office/sheets', '<div>Ведомости</div>')|raw }}
-            {{ HTML.anchor('/dean_office/credits', '<div>Зачеты</div>')|raw }}
+            <div>{{ HTML.anchor('/dean_office/sheets', 'Ведомости')|raw }}</div>
+            <div>{{ HTML.anchor('/dean_office/credits', 'Зачеты')|raw }}</div>
+            <hr/>
+            <div>{{ HTML.anchor('/dean_office/students', 'Студенты')|raw }}</div>
            {#  {{ HTML.anchor('/dean_office/exams', '<div>Экзамены</div>')|raw }} #}
         </div>
         <div class="deanContent">
diff --git a/~dev_rating/application/views/dean_office/credits.twig b/~dev_rating/application/views/dean_office/credits.twig
index 089a64bc52b60057d4d141bccf897081071d482a..06b8acbddb087797604b1913091ac4eac6ee03bc 100644
--- a/~dev_rating/application/views/dean_office/credits.twig
+++ b/~dev_rating/application/views/dean_office/credits.twig
@@ -23,7 +23,9 @@
                 {% endfor %}
             </select>
             <div class="infoBox">
-                <div><b>Преподаватели:</b> <span id="teachersOfDiscipline">---</span></div>
+                <div style="text-overflow: clip; height:1em">
+                    <b>Преподаватели:</b> <span id="teachersOfDiscipline">—</span>
+                </div>
                 <table width="100%" style="text-align: center; border-spacing: 5px; margin: 10px 0;">
                     <tr>
                         <td id="MilestoneTitle-0" style="width: 25%; {% if CurrentMilestone == 0 %}font-weight: bold;{% endif %}">Этап 1:<br>Семестр</td>
diff --git a/~dev_rating/application/views/dean_office/sheets.twig b/~dev_rating/application/views/dean_office/sheets.twig
index b5bec52078f84dc32dc5fff29fc27bd97a58be3a..ec03227a9d5657a789ca3e3f343d66e5e22a5828 100644
--- a/~dev_rating/application/views/dean_office/sheets.twig
+++ b/~dev_rating/application/views/dean_office/sheets.twig
@@ -7,6 +7,7 @@
     {{ HTML.style('media/css/discipline.css')|raw }}
     {{ HTML.script('media/js/dean_office/dean_office.js')|raw }}
 {% endblock %}
+
 {% block main_top_title %}Деканат > Ведомости{% endblock %}
 {% block dean_content %}
 
@@ -16,6 +17,7 @@
             <div class="itemBlock">
                 <div class="title">Форма контроля:</div>
                 <div class="field">
+                    <style>.RadioElemDiv { text-align: left; clear: both;}</style>
                     <div class="RadioElemDiv">
                         <label>
                             <input id="ExamChoice" name="DisciplineType" type="radio" value="exam">
diff --git a/~dev_rating/application/views/dean_office/students/handler/listOutput.twig b/~dev_rating/application/views/dean_office/students/handler/listOutput.twig
deleted file mode 100644
index 8d051a5a8b78248a92626e14bc1d2da57d3a6859..0000000000000000000000000000000000000000
--- a/~dev_rating/application/views/dean_office/students/handler/listOutput.twig
+++ /dev/null
@@ -1,37 +0,0 @@
-
-{# Вывод списков студентов #}
-{% set pageNum = 1 %}
-<div id="listPage{{ pageNum }}" class='paginatorPage'>
-{% for row in List %}
-    {% if loop.index % 16 == 0 %}
-        {% set pageNum = pageNum + 1 %}
-        </div>
-        <div id="listPage{{ pageNum }}" class='paginatorPage hiddenPage'>
-    {% endif %}
-    <div class="search_item">
-        <div class="search_item_info">
-            <div class="search_item_firstLine">{{ HTML.anchor('dean_office/students/' ~ row.AccountID,
-                row.LastName ~  ' ' ~ row.FirstName ~ ' ' ~ row.SecondName)|raw }} ({{ row.Degree }}, {{ row.GradeNum }} РєСѓСЂСЃ, {{ row.GroupNum }} РіСЂСѓРїРїР°)</div>
-        </div>
-        <div class="search_item_actions">
-            <a href="#" onclick="giveLeave({{ row.AccountID }})">В академ</a> /
-            <a href="#" onclick="stopLeave({{ row.AccountID }})">Из академа</a>
-        </div>
-    </div>
-{% else %}
-    Нет результатов!
-{% endfor %}
-</div>
-
-{% if pageNum > 1 %}
-    <div class="paginator">
-        <div class="paginator_title">Страницы:</div>
-    {% for i in range(1, pageNum)  %}
-        {% if loop.first %}
-            <a href="#" class="paginatorLink" id='listPage{{ loop.index }}'><div class="paginator_item selectedPageNum">{{ loop.index }}</div></a>
-        {% else %}
-            <a href="#" class="paginatorLink" id='listPage{{ loop.index }}'><div class="paginator_item">{{ loop.index }}</div></a>
-        {% endif %}
-    {% endfor %}
-    </div>
-{% endif %}
diff --git a/~dev_rating/application/views/dean_office/students/index.twig b/~dev_rating/application/views/dean_office/students/index.twig
index 7d8cde28a48ce8b1d5bf4ab9afac280d5b7cd595..e778ec44a69731fdc6b18bb4507f1f1a179d535e 100644
--- a/~dev_rating/application/views/dean_office/students/index.twig
+++ b/~dev_rating/application/views/dean_office/students/index.twig
@@ -1,32 +1,30 @@
-{% extends 'base' %}
+{% extends 'dean_office/base' %}
 
 {% block title %}Деканат > Ведомости{% endblock %}
 {% block media %}
+    {{ parent() }}
     {{ HTML.style('media/css/admin/searchBox.css')|raw }}
     {{ HTML.script('media/js/admin/students/index.js')|raw }}
-    {{ HTML.script('media/js/common/Studentslist.js')|raw }}
+    {#{{ HTML.script('media/js/common/Studentslist.js')|raw }}#}
 {% endblock %}
 
 {% block main_top_title %}Деканат > Студенты{% endblock %}
-{% block main_content %}
+{% block dean_content %}
     <div class='search'>
+
         <div class='search_box'>
             <div class='search_inputs'>
-                <!--div class='search_mainInput'>
-                    <input type='text' placeholder="Поиск по фамилии, имени, отчеству">
-                </div-->
                 <div class='search_inputFilters'>
+
                     <div class='filterLarge'>
-                        <select id="facultySelect">
-                            <option value="0">--- Подразделение ЮФУ ---</option>
-                            {% for row in Faculties %}
-                                <option value="{{ row.ID }}">{{ row.Name }} ({{ row.Abbr }})</option>
-                            {% endfor %}
-                        </select>
+                        <div class='search_mainInput'>
+                            <input type='text' placeholder="Поиск по фамилии, имени, отчеству">
+                        </div>
                     </div>
+
                     <div class='filter'>
                         <select id="gradeSelect">
-                            <option value="0">--- РљСѓСЂСЃ ---</option>
+                            <option value="0">— Курс —</option>
                             {% for Degree in Grades %}
                                 <optgroup label="{{ Degree.Title }}">
                                     {% for Grade in Degree.Grades %}
@@ -36,32 +34,27 @@
                             {% endfor %}
                         </select>
                     </div>
+
                     <div class='filter'>
                         <select id="groupSelect">
-                            <option value="0">--- Учебная группа ---</option>
+                            <option value="0">— Учебная группа —</option>
                         </select>
                     </div>
+
                 </div>
             </div>
         </div>
-        <div class='search_results'>
-            <div class='search_results_title' id="search_title">
 
-            </div>
+        <div class='search_results'>
+            <div class='search_results_title' id="search_title"><!-- search results --></div>
             <div class='results' id='search_results'>
-                <div class='search_results_title'>Для отображения списка студентов <b>выберите</b> один из пунктов или <b>введите</b> запрос в поисковое поле.</div>
+                <div class='search_results_title'>
+                    Для отображения списка студентов <b>выберите</b> один
+                    из пунктов или <b>введите</b> запрос в поисковое поле.
+                </div>
             </div>
         </div>
-    </div>
-
-    <script type="application/javascript">
-        function giveLeave(id) {
-            $.get(URLdir + 'handler/admStudents/giveLeave/?id=' + id);
-        }
 
-        function stopLeave(id) {
-            $.get(URLdir + 'handler/admStudents/stopLeave/?id=' + id);
-        }
-    </script>
+    </div>
 {% endblock %}
 
diff --git a/~dev_rating/application/views/dean_office/students/profile.twig b/~dev_rating/application/views/dean_office/students/profile.twig
new file mode 100644
index 0000000000000000000000000000000000000000..fd425ac015c4d12c867f6c3af213f7d5edfe7784
--- /dev/null
+++ b/~dev_rating/application/views/dean_office/students/profile.twig
@@ -0,0 +1,50 @@
+{% extends 'dean_office/base' %}
+
+{% block title %}Деканат > Ведомости{% endblock %}
+{% block media %}
+    {{ parent() }}
+    {{ HTML.style('media/css/admin/profilePage.css')|raw }}
+    {{ HTML.script('media/js/admin/students/profile.js')|raw }}
+{% endblock %}
+
+{% block main_top_title %}Деканат > Студенты{% endblock %}
+{% block dean_content %}
+
+    <div class="profilePage ">
+        <div class="profile_clearFix">
+            <div class="username"><h3>{{ Profile.FirstName }} {{ Profile.SecondName }} {{ Profile.LastName }}</h3></div>
+        </div>
+        <div class="profile_clearFix">
+            <div class="label">Подразделение:</div>
+            <div class="labeled_info">{{ Profile.FacultyName }}</div>
+        </div>
+        <div class="profile_clearFix">
+            <div class="label">Направление:</div>
+            <div class="labeled_info">{{ Profile.SpecName }}</div>
+        </div>
+        <div class="profile_clearFix">
+            <div class="label">РљСѓСЂСЃ, РіСЂСѓРїРїР°:</div>
+            <div class="labeled_info">{{ Rus[Profile.Degree] }}, {{ Profile.GradeNum }} РєСѓСЂСЃ, {{ Profile.GroupNum }} РіСЂСѓРїРїР°</div>
+        </div>
+        {% if Account.Code %}
+            <div class="profile_clearFix">
+                <div class="label">Код активации:</div>
+                <div class="labeled_info">{{ Account.Code|default('<Аккаунт активирован>') }}</div>
+            </div>
+        {% endif %}
+        <div class="profile_clearFix">
+            <div class="label">Имя пользователя:</div>
+            <div class="labeled_info">{{ Account.Login|default('—') }}</div>
+        </div>
+        <div class="profile_clearFix">
+            <div class="label">E-Mail:</div>
+            <div class="labeled_info">{{ Account.EMail|default('—') }}</div>
+        </div>
+
+        <div style="margin-top: 20px">
+            <button class="defaultForm BlueButton HalfWidth" id="AcademyTransfer">Отправить в академ</button>
+        </div>
+    </div>
+
+{% endblock %}
+
diff --git a/~dev_rating/application/views/admin/students/handler/listOutput.twig b/~dev_rating/application/views/handler/listStudents.twig
similarity index 67%
rename from ~dev_rating/application/views/admin/students/handler/listOutput.twig
rename to ~dev_rating/application/views/handler/listStudents.twig
index aa77c6b83c75de572749c045835ad9a960a5b6f9..26da8e17402a2413ddeb4e7381106071862f7c8f 100644
--- a/~dev_rating/application/views/admin/students/handler/listOutput.twig
+++ b/~dev_rating/application/views/handler/listStudents.twig
@@ -10,15 +10,21 @@
     {% endif %}
     <div class="search_item">
         <div class="search_item_info">
-            <div class="search_item_firstLine">{{ HTML.anchor('admin/profile/student/' ~ row.AccountID, 
-                row.LastName ~  ' ' ~ row.FirstName ~ ' ' ~ row.SecondName)|raw }} ({{ row.Degree }}, {{ row.GradeNum }} РєСѓСЂСЃ, {{ row.GroupNum }} РіСЂСѓРїРїР°)</div>
+            <div class="search_item_firstLine">
+                {% set name = row.LastName ~ ' ' ~ row.FirstName ~ ' ' ~ row.SecondName %}
+                {{ HTML.anchor('students/' ~ row.AccountID, name|e)|raw }}
+            </div>
         </div>
         <div class="search_item_actions">
-            <a href="#">Редактировать</a>
+            {{ Rus[row.Degree]|lower }}, {{ row.GradeNum }} РєСѓСЂСЃ, {{ row.GroupNum }} РіСЂСѓРїРїР°
         </div>
     </div>
 {% else %}
-    Нет результатов!
+    <div class="search_item">
+        <div class="search_item_info">
+            <div class="search_item_firstLine">Не найдено!</div>
+        </div>
+    </div>
 {% endfor %}
 </div>
 
diff --git a/~dev_rating/application/views/handler/report.twig b/~dev_rating/application/views/handler/report.twig
new file mode 100644
index 0000000000000000000000000000000000000000..d8d14faef5969e74965d996cb77d822e5419cfaa
--- /dev/null
+++ b/~dev_rating/application/views/handler/report.twig
@@ -0,0 +1,17 @@
+{% spaceless %}
+{% set name = User.LastName ~ ' ' ~ User.FirstName ~ ' ' ~ User.SecondName %}
+
+
+Faculty:     {{ User.FacultyName }}
+{% if User.Type == "teacher" %}
+Department:  {{ User.DepName }}
+Type:        Преподаватель
+{% elseif User.Type == 'student' %}
+Degree:      {{ User.Degree }}  Grade: {{ User.GradeNum }}  Group: {{ User.GroupNum }}
+Type:        Студент
+{% endif %}
+Sender:      {{ name }}
+
+Title: {{ Title }}
+Message: {{ Text  }}
+{% endspaceless %}
\ No newline at end of file
diff --git a/~dev_rating/application/views/popup/settings.twig b/~dev_rating/application/views/popup/settings.twig
index 1da7d2fdfb1495a7dadbc1b57fe5f82389d542c7..6801a5136787b82843721ca430b0125a909d9b68 100644
--- a/~dev_rating/application/views/popup/settings.twig
+++ b/~dev_rating/application/views/popup/settings.twig
@@ -1,6 +1,7 @@
 {# File format: WindowTitle||WindowWidth||WindowTop||WindowContent #}
 Настройки аккаунта||600px||10%||
 <div class="pageProfileSettings">
+    <style>.settingsSection { margin-top: 10px; }</style>
     <div class="settingsSection">
         <h2 class="defaultForm marginBetween">Смена логина</h2>
         <p class="help">Логин может состоять из латинских букв, цифр и символа _</p>
diff --git a/~dev_rating/application/views/sign.twig b/~dev_rating/application/views/sign.twig
index dec707fb0c3a6e481e4cf7826a3fc293732d6d8e..10f216a43d1839099ce2ccb4f873d87b47abe45b 100644
--- a/~dev_rating/application/views/sign.twig
+++ b/~dev_rating/application/views/sign.twig
@@ -1,17 +1,20 @@
-{% macro input(name, type, value, placeholder) %}
+<!DOCTYPE html>
+
+{% macro input(name, type, value, placeholder, focus) %}
+    {% if focus %}{% set focus = 'autofocus' %}{% endif %}
     {% if type != 'button' %}
-        <input id='{{ name }}' placeholder='{{ placeholder }}' class="marginBetween defaultForm" type='{{ type }}' name='{{ name }}' value='{{ value }}'>
+        <input id='{{ name }}' placeholder='{{ placeholder }}' {{ focus }} class="marginBetween defaultForm" type='{{ type }}' name='{{ name }}' value='{{ value }}'>
     {% else %}
         <input id='{{ name }}' type='{{ type }}' name='{{ name }}' class="defaultForm GreenButton FullWidth" value='{{ value }}'>
     {% endif %}
 {% endmacro %}
-  
+
 {% import 'sign' as sign %}
-<!DOCTYPE html> 
+
 <html>
     <head>
         <title>{% block pagename %}Вход в систему{% endblock %} | {{ System.Title }}</title>
-        <link href='http://fonts.googleapis.com/css?family=PT+Sans&subset=cyrillic-ext,latin' rel='stylesheet' type='text/css'>
+        <link href='https://fonts.googleapis.com/css?family=PT+Sans&subset=cyrillic-ext,latin' rel='stylesheet' type='text/css'>
         {{ HTML.style('media/less/common.css')|raw }}
         {{ HTML.style('media/less/sign/sign.css')|raw }}
 
@@ -70,10 +73,26 @@
         <div class="main_layer">
             <div class="main">
                 <div class="main_content sidePadding" style="overflow: hidden">
-                    <div class="Updates">
-                        <h2>Обновления {{ Updates.Date }}</h2>
-                        {{ Updates.Text|raw }}
-                    </div>
+                    <style>.invisible { display: none; } .visible { display: inline-block; }</style>
+                    {% for Message in Updates|slice(0, 10) %}
+                        <div class="Updates invisible {% if loop.first %}visible{% endif %}">
+                            <h2>
+                                {% if not loop.last %}
+                                    <span style="float:left">
+                                        <a href="#" class="left" style="color:white">&lt;</a>
+                                    </span>
+                                {% endif %}
+                                Обновления {{ Message.date }}
+                                {% if not loop.first %}
+                                    <span style="float:right">
+                                        <a href="#" class="right" style="color:white">&gt;</a>
+                                    </span>
+                                {% endif %}
+                            </h2>
+                            {{ Markdown.parse(Message.text)|raw }}
+                        </div>
+                    {% endfor %}
+
                     <div class="AuthForm">
                         <h2>{% block title %} {% endblock %}</h2>
                         {% block forms %} {% endblock %}
diff --git a/~dev_rating/application/views/sign/in.twig b/~dev_rating/application/views/sign/in.twig
index 0576284e206f43ff34aa17ab1affedee24025152..9b438ce7ef8d04e693e11874676a414b2681a960 100644
--- a/~dev_rating/application/views/sign/in.twig
+++ b/~dev_rating/application/views/sign/in.twig
@@ -3,7 +3,7 @@
 {% block title %}Авторизация{% endblock %}
 {% block forms %}
     <div id='inputs'>
-        {{ sign.input('login', 'text', '', 'Логин или E-Mail') }}
+        {{ sign.input('login', 'text', '', 'Логин или E-Mail', true) }}
         {{ sign.input('password', 'password', '', 'Пароль') }}
     </div>
     {{ sign.input('signin_b', 'button', 'Войти') }}
diff --git a/~dev_rating/application/views/student/index.twig b/~dev_rating/application/views/student/index.twig
index a40c09db310b70f1cbde28d95c77a5f35694e36e..2b2cb17f75107ab7feb0a39138c852155e23bd83 100644
--- a/~dev_rating/application/views/student/index.twig
+++ b/~dev_rating/application/views/student/index.twig
@@ -1,41 +1,47 @@
 {% extends 'base' %}
 
-{% macro subject(i, HTML) %}
+{% macro subject(Discipline, Teachers, HTML) %}
 <tr class="disciplineRow">
 	<td class="discProgress">
-		<span title="Успеваемость по дисциплине" class="Circle {{ i.ColorScheme }}">
-			{% if i.MaxCurrentRate != 0 %}
-				{% if i.Rate >= i.MaxCurrentRate %}
+		<span title="Успеваемость по дисциплине" class="Circle {{ Discipline.ColorScheme }}">
+			{% if Discipline.MaxCurrentRate != 0 %}
+				{% if Discipline.Rate >= Discipline.MaxCurrentRate %}
 					100%
 				{% else %}
-					{{ (100 * i.Rate) // i.MaxCurrentRate }}%
+					{{ (100 * Discipline.Rate) // Discipline.MaxCurrentRate }}%
 				{% endif %}
 			{% else %}
-				---
+				—
 			{% endif %}
 		</span>
 	</td>
 
 	<td class="discTitle">
-		{{ HTML.anchor('subject/' ~ i.ID, i.Title)|raw }}
+		{{ HTML.anchor('subject/' ~ Discipline.ID, Discipline.SubjectName)|raw }}
 	</td>
 
     <td class="discTeachers">
-        {% for teacher in i.Teachers %}
-            {{ teacher }}<br>
+        {% if Discipline.Subtype == 'disciplinary_coursework' %}
+            Курсовая
+        {% elseif Discipline.Subtype == 'scientific_coursework' %}
+            Науч. рук.
         {% else %}
-            ---
-        {% endfor %}
+            {% for teacher in Teachers[Discipline.ID] %}
+                {{ Text.abbreviateName(teacher) }}<br>
+            {% else %}
+                —
+            {% endfor %}
+        {% endif %}
     </td>
 
 	<td class="discControl">
-		{{ i.Control }}
+		{{ Rus[Discipline.Type] }}
 	</td>
 
 	<td class="discRating">
-		<span title="Текущая сумма баллов по дисциплине">{{ i.Rate|default('0') }}</span>
+		<span title="Текущая сумма баллов по дисциплине">{{ Discipline.Rate|default('0') }}</span>
 		/
-		<span title="Максимально возможная на данный момент сумма баллов">{{ i.MaxCurrentRate|default('0') }}</span>
+		<span title="Максимально возможная на данный момент сумма баллов">{{ Discipline.MaxCurrentRate|default('0') }}</span>
 		/
 		<span title="Максимально возможная сумма в этом семестре">100</span>
 	</td>
@@ -56,7 +62,7 @@
 {% block main_content %}
 	<div>
 		<div class="semesterLayer">
-			{{ base.SemesterSwitcher(Semester, SemesterList) }}
+			{{ base.SemesterSwitcher(SemesterList) }}
 		</div>
 		<div class="helpLink">
 			<a href="#" id="openHelp">Справка</a>
@@ -70,8 +76,8 @@
 			<td class="discControl">Форма аттестации</td>
 			<td>Текущие баллы</td>
 		</tr>
-		{% for i in disciplines %}
-			{{ res.subject(i, HTML) }}
+		{% for i in Disciplines %}
+			{{ res.subject(i, Teachers, HTML) }}
 		{% else %}
 			<tr>
 				<td colspan="5"><h2 style="text-align: center;">В настоящий момент Вы не подписаны ни на одну из существующих дисциплин.</h2></td>
diff --git a/~dev_rating/application/views/student/subject.twig b/~dev_rating/application/views/student/subject.twig
index 7ff4982cdc4c1faee749aa1b3e30b0cc21cbd6b4..8e91981850c9a581a09c35cde2767af735127669 100644
--- a/~dev_rating/application/views/student/subject.twig
+++ b/~dev_rating/application/views/student/subject.twig
@@ -14,44 +14,38 @@
 
 {% import _self as map %}
 
-{% block title %}{{ Discipline.Title|default('РЈРљР”') }}{% endblock %}
+{% block title %}{{ Discipline.SubjectName|default('РЈРљР”') }}{% endblock %}
 {% block main_top_title %}Учебная карта дисциплины{% endblock %}
 {% block main_content_classes %}sidePadding{% endblock %}
 
 {% block main_content %}
 
     <div class="pageTitle">
-        <h2>{{ Discipline.Title|default('---') }}</h2>
+        <h2>{{ Discipline.SubjectName|default('—') }}</h2>
     </div>
 
     <div class="disciplineInfo first">
-        <div class="clearFix">
-            <div class="label">Рабочий план дисциплины:</div>
-            <div class="content">{{ Discipline.DWPLink|default('-- ссылка на рабочий план дисциплины --') }}</div>
-        </div>
-
         <div class="clearFix">
             <div class="label">Форма аттестации:</div>
-            <div class="content">{{ Discipline.Control|default('---') }}</div>
+            <div class="content">{{ Rus[Discipline.Type] |default('—') }}</div>
         </div>
         <div class="clearFix">
             <div class="label">Семестр:</div>
             <div class="content">
-                {{ Discipline.Num }} семестр {{ Discipline.Year }}/{{ Discipline.Year + 1 }} учебного года
+                {{ Semester.Season == 'autumn' ? 'Осенний' : 'Весенний' }} семестр
+                {{ Semester.Year }}/{{ Semester.Year + 1 }} учебного года
             </div>
         </div>
     </div>
 
     <div class="disciplineInfo last">
-        <div class="clearFix">
-            <div class="label">Кафедра:</div>
-            <div class="content">{{ Discipline.DepName }}</div>
-        </div>
         <div class="clearFix">
             <div class="label">Преподаватели:</div>
             <div class="content">
-                {% for teacher in Discipline.Teachers %}
-                    {{ teacher }}{% if not loop.last %},{% endif %}
+                {% for Teacher in Teachers %}
+                    <div>{{ Teacher.Name }}</div>
+                {% else %}
+                    —
                 {% endfor %}
             </div>
         </div>
@@ -59,30 +53,30 @@
             <div class="label">Учебная нагрузка:</div>
             <div class="content">
 
-                {% if (Discipline.PracticeCount) and (Discipline.LabCount) %}
+                {% if (Discipline.Practice) and (Discipline.Labs) %}
                     {% set FirstConjuction = ',' %}
                     {% set SecondConjuction = ' Рё' %}
-                {% elseif (Discipline.PracticeCount) or (Discipline.LabCount) %}
-                    {% if Discipline.LectureCount %}
+                {% elseif (Discipline.Practice) or (Discipline.Labs) %}
+                    {% if Discipline.Lectures %}
                         {% set FirstConjuction = ' Рё' %}
-                    {% elseif Discipline.LabCount %}
+                    {% elseif Discipline.Labs %}
                         {% set SecondConjuction = ' Рё' %}
                     {% endif %}
                 {% endif %}
 
-                {% if Discipline.LectureCount %}
-                    {{ Discipline.LectureCount }}
-                    {{ Rus.NumEnding(Discipline.LectureCount, ['час', 'часа', 'часов']) }}
+                {% if Discipline.Lectures %}
+                    {{ Discipline.Lectures }}
+                    {{ Rus.NumEnding(Discipline.Lectures, ['час', 'часа', 'часов']) }}
                     теории{{ FirstConjuction }}
                 {% endif %}
-                {% if Discipline.PracticeCount %}
-                    {{ Discipline.PracticeCount }}
-                    {{ Rus.NumEnding(Discipline.PracticeCount, ['час', 'часа', 'часов']) }}
+                {% if Discipline.Practice %}
+                    {{ Discipline.Practice }}
+                    {{ Rus.NumEnding(Discipline.Practice, ['час', 'часа', 'часов']) }}
                     практики{{ SecondConjuction }}
                 {% endif %}
-                {% if Discipline.LabCount %}
-                    {{ Discipline.LabCount }}
-                    {{ Rus.NumEnding(Discipline.LabCount, ['час', 'часа', 'часов']) }}
+                {% if Discipline.Labs %}
+                    {{ Discipline.Labs }}
+                    {{ Rus.NumEnding(Discipline.Labs, ['час', 'часа', 'часов']) }}
                     лабораторных занятий
                 {% endif %}
 
@@ -105,7 +99,7 @@
                 </div>
                 <div class="submodulePercent">
                     {% if Submodule.MaxRate <= 0 %}
-                        ---
+                        —
                     {% else %}
                         {{ (Submodule.Rate  * 100) // Submodule.MaxRate }} %
                     {% endif %}
@@ -114,7 +108,7 @@
                     {% if Submodule.Date != 0 %}
                         {{ Submodule.Date|date('d.m.Y') }}
                     {% else %}
-                        ---
+                        —
                     {% endif %}
                 </div>
             </div>
@@ -126,7 +120,7 @@
         {% endfor %}
     {% endfor %}
     </div>
-    {% if Discipline.ExamType == 'exam' %}
+    {% if Discipline.Type == 'exam' %}
     <h3 class="blockTitle">Допуск к экзамену</h3>
     <div class="blockMargin">
         {% set Admission = 38 - (DisciplineMap.SemesterRate + DisciplineMap.Extra.Rate) %}
@@ -141,7 +135,7 @@
                     <div class="submoduleTitle">Добор баллов</div>
                     <div class="submoduleRate">{{ DisciplineMap.Extra.Rate }}</div>
                     <div class="submodulePercent">&nbsp;</div>
-                    <div class="submoduleDate">---</div>
+                    <div class="submoduleDate">—</div>
                 </div>
             </div>
         {% endif %}
@@ -154,7 +148,7 @@
     <h3 class="blockTitle">Экзамен</h3>
     <div class="blockMargin">
         <div class="tableTitle Extra">
-            Экзамен по курсу &laquo;{{ Discipline.Title|default('---') }}&raquo;
+            Экзамен по курсу &laquo;{{ Discipline.SubjectName|default('—') }}&raquo;
         </div>
         {% if DisciplineMap.Bonus is not empty %}
         <div class="submoduleBlock">
@@ -170,14 +164,14 @@
                 {% if DisciplineMap.Bonus.Date != 0 %}
                     {{ DisciplineMap.Bonus.Date|date('d.m.Y') }}
                 {% else %}
-                    ---
+                    —
                 {% endif %}
             </div>
         </div>
         {% endif %}
         {% if DisciplineMap.Exam is not empty %}
             <div class="submoduleBlock">
-                <div class="submoduleTitle">Экзамен по курсу &laquo;{{ Discipline.Title|default('---') }}&raquo;</div>
+                <div class="submoduleTitle">Экзамен по курсу &laquo;{{ Discipline.SubjectName|default('—') }}&raquo;</div>
                 <div class="submoduleRate">{{ DisciplineMap.Exam.Rate }} / {{ DisciplineMap.Exam.MaxRate }}</div>
                 <div class="submodulePercent">
                     {% if DisciplineMap.Exam.MaxRate == 0 %} 0 {% else %} {{ (DisciplineMap.Exam.Rate  * 100) // DisciplineMap.Exam.MaxRate }} % {% endif %}
@@ -186,7 +180,7 @@
                     {% if DisciplineMap.Exam.Date != 0 %}
                         {{ DisciplineMap.Exam.Date|date('d.m.Y') }}
                     {% else %}
-                        ---
+                        —
                     {% endif %}
                 </div>
             </div>
@@ -201,18 +195,18 @@
         Итоговый рейтинг: {{ Rating }} / 100
     </div>
 
-    {% elseif Discipline.ExamType == 'credit' %}
+    {% elseif Discipline.Type == 'credit' %}
         <h3 class="blockTitle">Зачет</h3>
         <div class="blockMargin">
             {% set Admission = 60 - (DisciplineMap.SemesterRate + DisciplineMap.Extra.Rate) %}
             {% if Admission > 0 %}
                 Для получения зачета необходимо набрать ещё {{ Admission }} {{ Rus.NumEnding(Admission, ['балл', 'балла', 'баллов']) }}.
             {% else %}
-                Поздравляем, Вы получили зачет по курсу &laquo;{{ Discipline.Title|default('---') }}&raquo;!
+                Поздравляем, Вы получили зачет по курсу &laquo;{{ Discipline.SubjectName|default('—') }}&raquo;!
             {% endif %}
             {% if ExtraRate or not Admission or DisciplineMap.Bonus is not empty %}
             <div class="tableTitle Extra">
-                Зачет по курсу &laquo;{{ Discipline.Title|default('---') }}&raquo;
+                Зачет по курсу &laquo;{{ Discipline.SubjectName|default('—') }}&raquo;
             </div>
             {% if ExtraRate or not Admission %}
                 <div class="blockMargin">
@@ -220,7 +214,7 @@
                         <div class="submoduleTitle">Добор баллов</div>
                         <div class="submoduleRate">{{ DisciplineMap.Extra.Rate }}</div>
                         <div class="submodulePercent">&nbsp;</div>
-                        <div class="submoduleDate">---</div>
+                        <div class="submoduleDate">—</div>
                     </div>
                 </div>
             {% endif %}
@@ -238,7 +232,7 @@
                         {% if DisciplineMap.Bonus.Date != 0 %}
                             {{ DisciplineMap.Bonus.Date|date('d.m.Y') }}
                         {% else %}
-                            ---
+                            —
                         {% endif %}
                     </div>
                 </div>
diff --git a/~dev_rating/application/views/teacher/discipline/CreateCoursework.twig b/~dev_rating/application/views/teacher/coursework/create.twig
similarity index 94%
rename from ~dev_rating/application/views/teacher/discipline/CreateCoursework.twig
rename to ~dev_rating/application/views/teacher/coursework/create.twig
index bc490a67b0a9bbf617bca184e29a14105dd4e748..c9ceff123c82de0ac243dc98ccc20d2a94716cb8 100644
--- a/~dev_rating/application/views/teacher/discipline/CreateCoursework.twig
+++ b/~dev_rating/application/views/teacher/coursework/create.twig
@@ -42,10 +42,10 @@
             <div class="title">Тип курсовой работы:</div>
             <div class="field">
                 <div class="RadioGroupDiv">
-                    <label><input name="type" type="radio" value="disciplinary" checked="true"> По дисциплине</label>
+                    <label><input name="subtype" type="radio" value="disciplinary" checked="true"> По дисциплине</label>
                 </div>
                 <div class="RadioGroupDiv">
-                    <label><input name="type" type="radio" value="scientific"> Научная</label>
+                    <label><input name="subtype" type="radio" value="scientific"> Научная</label>
                 </div>
             </div>
         </div>
diff --git a/~dev_rating/application/views/teacher/discipline/MapBase.twig b/~dev_rating/application/views/teacher/discipline/MapBase.twig
index cfc41c0417113a76206bf24817a7b0ff053b6203..e6a795b896d5cbcb1be425bd72ec1c828e0e9564 100644
--- a/~dev_rating/application/views/teacher/discipline/MapBase.twig
+++ b/~dev_rating/application/views/teacher/discipline/MapBase.twig
@@ -2,13 +2,16 @@
 
 {% block title %}
     Редактирование
-    {% if Discipline.IsCourseWork %}курсовой{% else %}дисциплины{% endif %}
+    {% if Discipline.Subtype %}курсовой{% else %}дисциплины{% endif %}
 {% endblock %} {# head -> title #}
 {% block media %} {# head -> css, js #}
 	{{ HTML.script('media/js/functions.js')|raw }}
 	
 	{{ HTML.script('media/js/discipline/general.js')|raw }}
 	{{ HTML.style('media/less/common/tabs.css')|raw }}
+    <script>
+        var g_disciplineID = {{ Discipline.ID }};
+    </script>
 	{% block discipline_media %}
 	
 	{% endblock %}
@@ -16,7 +19,7 @@
 
 {% block main_top_title %}
     Редактирование
-    {% if Discipline.IsCourseWork %}курсовой{% else %}дисциплины{% endif %}
+    {% if Discipline.Subtype %}курсовой{% else %}дисциплины{% endif %}
 {% endblock %}
 {% block main_content %}
 	{% if Discipline.IsLocked == 1 %}
@@ -26,11 +29,11 @@
 	{% endif %}
 	<div class="tabsWrapper">
 		<div class="tabs">
-			<div class="tab">{{ HTML.anchor('discipline/settings/'~Discipline.DisciplineID, '1. Базовые настройки', {'title': 'Шаг 1. Базовые настройки', 'class': ''~step_1})|raw }}</div>
-			<div class="tab">{{ HTML.anchor('discipline/structure/'~Discipline.DisciplineID, '2. Модули', {'title': 'Шаг 2. Модули', 'class': ''~step_2})|raw }}</div>
-			<div class="tab">{{ HTML.anchor('discipline/teachers/'~Discipline.DisciplineID, '3. Преподаватели', {'title': 'Шаг 3. Прикрепление преподавателей', 'class': ''~step_3})|raw }}</div>
-			<div class="tab">{{ HTML.anchor('discipline/groups/'~Discipline.DisciplineID, '4. Группы', {'title': 'Шаг 4. Прикрепление групп', 'class': ''~step_4})|raw }}</div>
-			<div class="tab">{{ HTML.anchor('discipline/students/'~Discipline.DisciplineID, '5. Студенты', {'title': 'Шаг 5. Прикрепление студентов', 'class': ''~step_5})|raw }}</div>
+			<div class="tab">{{ HTML.anchor('discipline/'~Discipline.ID~'/settings', '1. Базовые настройки', {'title': 'Шаг 1. Базовые настройки', 'class': ''~step_1})|raw }}</div>
+			<div class="tab">{{ HTML.anchor('discipline/'~Discipline.ID~'/structure', '2. Модули', {'title': 'Шаг 2. Модули', 'class': ''~step_2})|raw }}</div>
+			<div class="tab">{{ HTML.anchor('discipline/'~Discipline.ID~'/teachers', '3. Преподаватели', {'title': 'Шаг 3. Прикрепление преподавателей', 'class': ''~step_3})|raw }}</div>
+			<div class="tab">{{ HTML.anchor('discipline/'~Discipline.ID~'/groups', '4. Группы', {'title': 'Шаг 4. Прикрепление групп', 'class': ''~step_4})|raw }}</div>
+			<div class="tab">{{ HTML.anchor('discipline/'~Discipline.ID~'/students', '5. Студенты', {'title': 'Шаг 5. Прикрепление студентов', 'class': ''~step_5})|raw }}</div>
 		</div>
 	</div>
 	<div class="map_content sidePadding">
diff --git a/~dev_rating/application/views/teacher/discipline/CreateDiscipline.twig b/~dev_rating/application/views/teacher/discipline/create.twig
similarity index 90%
rename from ~dev_rating/application/views/teacher/discipline/CreateDiscipline.twig
rename to ~dev_rating/application/views/teacher/discipline/create.twig
index ca48df3e8c54f63ef3109f19a92969fa4d4622db..bacceb7d1672a40420099a72eb78078e613740e7 100644
--- a/~dev_rating/application/views/teacher/discipline/CreateDiscipline.twig
+++ b/~dev_rating/application/views/teacher/discipline/create.twig
@@ -37,19 +37,6 @@
 		</div>
 		<p class="comment">Нужно указать подразделение, в котором читается дисциплина.</p>
 	</div>
-	{#<div class="LayerSection">#}
-		{#<div class="itemBlock">#}
-			{#<div class="title">Тип курсовой работы:</div>#}
-			{#<div class="field">#}
-				{#<div class="RadioGroupDiv">#}
-					{#<label><input class="DiscType" name="DiscType" type="radio" value="credit" checked="true"> По дисциплине</label>#}
-				{#</div>#}
-				{#<div class="RadioGroupDiv">#}
-					{#<label><input class="DiscType" name="DiscType" type="radio" value="exam"> Научная</label>#}
-				{#</div>#}
-			{#</div>#}
-		{#</div>#}
-	{#</div>#}
 	<div class="LayerSection">
 		<div class="itemBlock">
 			<div class="title">Предмет:</div>
diff --git a/~dev_rating/application/views/teacher/discipline/EditGroups.twig b/~dev_rating/application/views/teacher/discipline/edit/groups.twig
similarity index 100%
rename from ~dev_rating/application/views/teacher/discipline/EditGroups.twig
rename to ~dev_rating/application/views/teacher/discipline/edit/groups.twig
diff --git a/~dev_rating/application/views/teacher/discipline/EditSettings.twig b/~dev_rating/application/views/teacher/discipline/edit/settings.twig
similarity index 85%
rename from ~dev_rating/application/views/teacher/discipline/EditSettings.twig
rename to ~dev_rating/application/views/teacher/discipline/edit/settings.twig
index 4ab3a8c9896486a3803eb985ee910ed79e16328b..e251d91bae4940c2a082d9bfbdc64032c91e5843 100644
--- a/~dev_rating/application/views/teacher/discipline/EditSettings.twig
+++ b/~dev_rating/application/views/teacher/discipline/edit/settings.twig
@@ -79,22 +79,22 @@
 				<div class="RadioElemDiv">
 					<label>
 						<input name="ExamType" class="ExamType" type="radio" value="exam" 
-						{% if Discipline.IsLocked == 1 %}disabled{%endif%} 
-						{% if Discipline.ExamType == 'exam' %}checked{% endif %}> Экзамен
+						{% if Discipline.IsLocked == 1 %}disabled{%endif%}
+						{% if Discipline.Type == 'exam' %}checked{% endif %}> Экзамен
 					</label>
 				</div>
 				<div class="RadioElemDiv">
 					<label>
 						<input name="ExamType" class="ExamType" type="radio" value="credit" 
-						{% if Discipline.IsLocked == 1 %}disabled{%endif%} 
-						{% if Discipline.ExamType == 'credit' %}checked{% endif %}> Зачет
+						{% if Discipline.IsLocked == 1 %}disabled{%endif%}
+						{% if Discipline.Type == 'credit' %}checked{% endif %}> Зачет
 					</label>
 				</div>
 				<div class="RadioElemDiv">
 					<label>
 						<input name="ExamType" class="ExamType" type="radio" value="grading_credit"
-						{% if Discipline.IsLocked == 1 %}disabled{%endif%} 
-						{% if Discipline.ExamType == 'grading_credit' %}checked{% endif %}> Дифф. зачет
+						{% if Discipline.IsLocked == 1 %}disabled{%endif%}
+						{% if Discipline.Type == 'grading_credit' %}checked{% endif %}> Дифф. зачет
 					</label>
 				</div>
 			</div>
@@ -104,7 +104,7 @@
 		<div class="itemBlock">
 			<div class="title">Лекционных часов:</div>
 			<div class="field">
-				<input class="InputLectureCount defaultForm" type="text" style="width: 80px;" value="{{ Discipline.LectureHours }}" {% if Discipline.IsLocked == 1 %}disabled{%endif%}>
+				<input class="InputLectureCount defaultForm" type="text" style="width: 80px;" value="{{ Discipline.Lectures }}" {% if Discipline.IsLocked == 1 %}disabled{%endif%}>
 			</div>
 		</div>
 	</div>
@@ -112,7 +112,7 @@
 		<div class="itemBlock">
 			<div class="title">Практических часов:</div>
 			<div class="field">
-				<input class="InputPracticeCount defaultForm" type="text" style="width: 80px;" value="{{ Discipline.PracticeHours }}" {% if Discipline.IsLocked == 1 %}disabled{%endif%}>
+				<input class="InputPracticeCount defaultForm" type="text" style="width: 80px;" value="{{ Discipline.Practice }}" {% if Discipline.IsLocked == 1 %}disabled{%endif%}>
 			</div>
 		</div>
 	</div>
@@ -120,7 +120,7 @@
 		<div class="itemBlock">
 			<div class="title">Лабораторных часов:</div>
 			<div class="field">
-				<input class="InputLabCount defaultForm" type="text" style="width: 80px;" value="{{ Discipline.LabHours }}" {% if Discipline.IsLocked == 1 %}disabled{%endif%}>
+				<input class="InputLabCount defaultForm" type="text" style="width: 80px;" value="{{ Discipline.Labs }}" {% if Discipline.IsLocked == 1 %}disabled{%endif%}>
 			</div>
 		</div>
 	</div>
diff --git a/~dev_rating/application/views/teacher/discipline/EditStructure.twig b/~dev_rating/application/views/teacher/discipline/edit/structure.twig
similarity index 95%
rename from ~dev_rating/application/views/teacher/discipline/EditStructure.twig
rename to ~dev_rating/application/views/teacher/discipline/edit/structure.twig
index 921385c62b148e9a217936a604ef791ed8f6cef8..52a0f0ff1495416e32eb80c6210eebb83d33c899 100644
--- a/~dev_rating/application/views/teacher/discipline/EditStructure.twig
+++ b/~dev_rating/application/views/teacher/discipline/edit/structure.twig
@@ -13,7 +13,7 @@
 
 {% block map_content %}
 	
-	<p class="notification" style="display: none;">{{ Discipline.SemesterNum }} семестр {{ Discipline.SemesterYear }}/{{ Discipline.SemesterYear + 1 }} учебного года</p>
+	<p class="notification" style="display: none;">{{ Rus[Discipline.Season] }} семестр {{ Discipline.Year }}/{{ Discipline.Year + 1 }} учебного года</p>
 	<div class="rateIndicatorDIV">
 		Количество баллов: <span class="rateIndicator">{{ Map.MaxRate }}</span>{% if Map.isSetBonus == true %} + 10 бонусных баллов{% endif %}
 	</div>
diff --git a/~dev_rating/application/views/teacher/discipline/EditStudents.twig b/~dev_rating/application/views/teacher/discipline/edit/students.twig
similarity index 94%
rename from ~dev_rating/application/views/teacher/discipline/EditStudents.twig
rename to ~dev_rating/application/views/teacher/discipline/edit/students.twig
index ceda6a7c9dc7f7ade43ab72520528066126095df..bf7b08b2751fe406b20d24505c3acff466b2e3d0 100644
--- a/~dev_rating/application/views/teacher/discipline/EditStudents.twig
+++ b/~dev_rating/application/views/teacher/discipline/edit/students.twig
@@ -19,7 +19,7 @@
 {% endmacro %}
 
 
-{% import 'teacher/discipline/EditStudents' as idx %}
+{% import 'teacher/discipline/edit/students' as idx %}
 
 {% block map_content %}
 
@@ -30,7 +30,7 @@
         <h2 class="BlueTitle">Основные студенты</h2>
         {% for group in Groups %}
             <div class="GradeAndGroupTitle ActionShowHideGroupContainer" id="{{ group.GroupID }}">
-                <span class="info">{{ group.Degree }}, РєСѓСЂСЃ {{ group.GradeNum }} РіСЂСѓРїРїР° {{ group.GroupNum }}</span>
+                <span class="info">{{ Rus[group.Degree] }}, РєСѓСЂСЃ {{ group.GradeNum }} РіСЂСѓРїРїР° {{ group.GroupNum }}</span>
                 <span class="Action">Открыть список ▼</span>
             </div>
 
diff --git a/~dev_rating/application/views/teacher/discipline/EditTeachers.twig b/~dev_rating/application/views/teacher/discipline/edit/teachers.twig
similarity index 96%
rename from ~dev_rating/application/views/teacher/discipline/EditTeachers.twig
rename to ~dev_rating/application/views/teacher/discipline/edit/teachers.twig
index 2549a4d829227bb0c3a50257ec52947cd5d13724..b5b6781e2327911c865be3f51fa0644b5b858876 100644
--- a/~dev_rating/application/views/teacher/discipline/EditTeachers.twig
+++ b/~dev_rating/application/views/teacher/discipline/edit/teachers.twig
@@ -14,7 +14,7 @@
 		{% for Teacher in BindTeachersList %}
 			<div class="Teacher" id="{{ Teacher.ID }}">
 				<div class="Name">{{ Teacher.LastName }} {{ Teacher.FirstName }} {{ Teacher.SecondName }}</div>
-				{% if Teacher.IsAuthor == 0 %}
+				{% if Teacher.IsAuthor == 0 %} {# TODO: check whether IsAuthor defined #}
 					<button class="Action_UnbindTeacher Action">Отсоединить</button>
 					<button class="Action_ChangeOwner Action">Передать дисциплину</button>
 				{% else %}
diff --git a/~dev_rating/application/views/teacher/exam.twig b/~dev_rating/application/views/teacher/exam.twig
index 586ba7a689ecaa7ac0b68a418c295691fdf7e3e3..0573d9b11689e452736388d431f1444222196cee 100644
--- a/~dev_rating/application/views/teacher/exam.twig
+++ b/~dev_rating/application/views/teacher/exam.twig
@@ -11,9 +11,9 @@
 
 {% block main_top_title %}Сессия{% endblock %}
 {% block main_content %}
-	<h2 class="h2_titleSubject"> {{ disciplineInfo.LocalizedExamType }} </h2>
+	<h2 class="h2_titleSubject"> {{ Discipline.LocalizedExamType }} </h2>
 
-    {{ HTML.anchor('rate/'~disciplineInfo.DisciplineID,
+    {{ HTML.anchor('rate/'~Discipline.ID,
             "← Перейти к оцениванию", 
             {'title': 'Оценивание', 'class': 'rate_a'})|raw }}
 
@@ -44,7 +44,7 @@
 				</td>
 			{% endfor %}
 			<td class="subject" rowspan="3">Бонус</td>
-			{% if disciplineInfo.isBonus == false %}
+			{% if Discipline.IsBonus == false %}
 
 			{% endif %}
 			<td class="subject" rowspan="3">Итог</td>
@@ -123,6 +123,12 @@
 				<td class="group" colspan="{{ columnsCount }}">
 					{% if group.isAttached == 1 %} {{ group.GradeTitle }} {% endif %}{{ group.GroupNum }} РіСЂСѓРїРїР°.
 					<span class="downloadExcelStatement" id="group_{{ group.GroupID }}">Скачать ведомость</span>
+					<select id="stageSelector_{{ group.GroupID }}" class="stageSelector">
+						<option value="0">До экзамена</option>
+						<option value="1" selected="selected">Экзамен</option>
+						<option value="2">Пересдача 1</option>
+						<option value="3">Пересдача 2</option>
+					</select>
 				</td>
 			</tr>
  
@@ -138,24 +144,25 @@
 						{% set col = col + 1 %}
 						
 						{% if r.ModuleType == 'exam' %}
-							{% set td_class = 'attemptCell' %}
+							{% set td_class = 'commonCell attemptCell' %}
 						{% endif %}
 						{% if r.ModuleType == 'extra' %}
-							{% set td_class = 'additionalCell' %}
+							{% set td_class = 'commonCell additionalCell' %}
 						{% endif %}					
 
 						{% if r.Block == 'True' or (r.ModuleType != 'extra' and student.RateResult < 38) %}
-							<td class="staticCell {{ td_class }}" id="col_{{ col }}_row_{{ row }}"> 
+							<td class="{{ td_class }}" id="col_{{ col }}_row_{{ row }}">
 								<input type="text" value="{{ r.Rate  }}" disabled="disabled">
 							</td>
 						{% else %}
-							<td class="commonCell {{ td_class }}" id="col_{{ col }}_row_{{ row }}"> 
+							<td class="{{ td_class }}" id="col_{{ col }}_row_{{ row }}">
 								<input type="text" value="{{ r.Rate  }}" 
 									{% if r.ModuleType == 'extra' %}
+										class = "extra"
 										{% if r.MaxRate > 0 %}
 											placeholder="макс. {{r.MaxRate}}" 
 										{% else %} 
-											placeholder="---" 
+											placeholder="—"
 											disabled="disabled" 
 										{% endif %}
 									{% endif %}
@@ -165,12 +172,14 @@
 						
 						{% if r.ModuleType == 'exam' %}
 							<td class="absenceCell {{ td_class }}" id="absence_{{col}}_{{row}}">
-								<input type="checkbox" class="absenceCheck">
+								<input type="checkbox" class="absenceCheck"
+								{% if r.ExamPeriodOption == 'absence' %} checked="true" {% endif %}>
 							</td>
 							
 							{% if autoPassNotAdded %}
 								<td class="autoPass {{ td_class }}" id="autopass_{{col}}_{{row}}">
-									<input type="checkbox" class="autoPassCheck">
+									<input type="checkbox" class="autoPassCheck"
+									{% if r.ExamPeriodOption == 'pass' %} checked="true" {% endif %}>
 								</td>
 								{% set autoPassNotAdded = false %}
 							{% endif %}
@@ -192,8 +201,8 @@
 			<span id="maxRate">Максимальный балл: <b></b></span>
 		</div>
 	</div>
-	<div id="hidden_div">
-		{{ disciplineInfo_JSON|raw }}
+	<div id="hidden_div" style="display: none;">
+		{{ Discipline_JSON|raw }}
 	</div>
 	<input type="hidden" id="pageType" value="exam"/> 
 {% endblock %}
\ No newline at end of file
diff --git a/~dev_rating/application/views/teacher/index.twig b/~dev_rating/application/views/teacher/index.twig
index 2d5a357c9dcda5f40b8cc20f4c68e90d06efe934..b8d443a4ab0c87afc28886b819e2628dc550cb08 100644
--- a/~dev_rating/application/views/teacher/index.twig
+++ b/~dev_rating/application/views/teacher/index.twig
@@ -7,82 +7,69 @@
     {{ HTML.style('media/less/common/buttons.css')|raw }}
 {% endblock %}
 
-{% macro outputSubject(Subject, HTML) %}
+{% macro outputDiscipline(Discipline, Groups, Teachers) %}
+    {% set IsAuthor = Discipline.AuthorID == User.TeacherID %}
 
-<div class="discipline">
-    <div class="discipline_groups">
-        <div class="grade_title">
-            {{ Subject.Title }}
-            {% if Subject.GradeNum > 0 %}| {{ Subject.Degree }}, {{ Subject.GradeNum }} РєСѓСЂСЃ
+    <tr class="group_block">
+        <td class='info_cell td_group'>
+            {{ Groups[Discipline.ID] |join(', ') |default('—') }}
+        </td>
+        <td class='info_cell td_control'>
+            {{ Discipline.Subtype ? Rus[Discipline.Subtype] : Rus[Discipline.Type] |default('—') }}
+        </td>
+        <td class='info_cell td_teachers'>
+            {% if Discipline.Subtype == 'scientific_coursework' %}
+                Сотрудники кафедры
+            {% else %}
+                {% for teacher in Teachers[Discipline.ID] | slice(0, 7) %}
+                    <div>{{ Text.abbreviateName(teacher) }}</div>
+                {% else %}
+                    —
+                {% endfor %}
             {% endif %}
-        </div>
-        {% for Discipline in Subject.Disciplines %}
-            {% if loop.first %}
-            <div class="group_table">
-                <table cellspacing="0" border="0" width="100%">
+        </td>
+        <td class='action_cell'>
+            {% if Discipline.IsMapCreated %}
+                {{ HTML.anchor('rate/'~Discipline.ID, "Оценивание", {
+                    'title': 'Выставление баллов по дисциплине',
+                    'class': 'disc_button active'
+                }) |raw }}
+            {% else %}
+                <div class="disc_button inactive" alt="Для дисциплины не создана учебная карта">
+                    Оценивание
+                </div>
             {% endif %}
-                    <tr class="group_block">
-                        <td class='info_cell td_group'>
-                            {{ Discipline.Groups|default('---') }}
-                        </td>
-                        <td class='info_cell td_control'>
-                            {{ Discipline.ControlType|default('---') }}
-                        </td>
-                        <td class='info_cell td_teachers'>
-                            {% for teacher in Discipline.Teachers %}
-                                <div>{{ teacher }}</div>
-                            {% else %}
-                                ---
-                            {% endfor %}
-                        </td>
-                        <td class='action_cell'>
-                            {% if Discipline.IsMapCreated %}
-                                {{ HTML.anchor('rate/'~Discipline.ID, 
-                                        "Оценивание", 
-                                        {'title': 'Выставление баллов по дисциплине', 'class': 'disc_button active'})|raw }}
-                            {% else %}
-                                <div class="disc_button inactive" alt="Для дисциплины не создана учебная карта">
-                                        Оценивание
-                                </div>
-                            {% endif %}
-                        </td>
-                        <td class='action_cell'>
-                            {% if Discipline.IsAuthor %}
-								{% if Discipline.IsLocked %}
-								    {% set btnName = "Просмотр" %}
-								{% else %}
-								    {% set btnName = "Редактирование" %}
-                                {% endif %}															
-                                {{ HTML.anchor('discipline/structure/'~Discipline.ID, btnName, 
-                                        {'title': 'Просмотр и редактирование дисциплины', 'class': 'disc_button active'})|raw }}
-                            {% else %}
-                                <div class="disc_button inactive" alt="В разработке">
-                                        Просмотр
-                                </div>
-{#                                 {{ HTML.anchor('discipline/show/'~Discipline.ID, 
-                                    "Просмотр", 
-                                    {'title': 'Просмотр дисциплины', 'class': 'disc_button active'})|raw }} #}
-                            {% endif %}
-                        </td>
-                        <td class='delete_cell'>
-							{% if Discipline.IsLocked == 0 and Discipline.IsAuthor == 1 %}
-								{{Discipline.AuthorID}}
-                        		<button class="DeleteDiscipline" id="{{ Discipline.ID }}" title="Удалить дисциплину">&nbsp;</button>
-                            {% else %}
-                                &nbsp;
-                        	{% endif %}
-                        </td>
-                    </tr>
-            {% if loop.last %}        
-                </table>
-            </div>
+        </td>
+        <td class='action_cell'>
+            {% if IsAuthor %}
+                {% if Discipline.IsLocked %}
+                    {% set btnName = "Просмотр" %}
+                {% else %}
+                    {% set btnName = "Редактирование" %}
+                {% endif %}
+                {{ HTML.anchor('discipline/'~Discipline.ID, btnName, {
+                    'title': 'Просмотр и редактирование дисциплины',
+                    'class': 'disc_button active'
+                }) |raw }}
+            {% else %}
+                <div class="disc_button inactive" alt="В разработке">
+                    Просмотр
+                </div>
+                {#    {{ HTML.anchor('discipline/show/'~Discipline.ID, "Просмотр",
+                       {'title': 'Просмотр дисциплины', 'class': 'disc_button active'})|raw }} #}
             {% endif %}
-        {% endfor %}
-    </div>
-</div>
+        </td>
+        <td class='delete_cell'>
+            {% if Discipline.IsLocked == 0 and IsAuthor %}
+                <button class="DeleteDiscipline" id="{{ Discipline.ID }}" title="Удалить дисциплину">&nbsp;</button>
+            {% else %}
+                &nbsp;
+            {% endif %}
+        </td>
+    </tr>
 {% endmacro %}
 
-{% import 'teacher/index' as idx %}
+{% import _self as self %}
 
 {% block main_content_classes %}sidePadding{% endblock %}
 {% block main_top_title %}Дисциплины{% endblock %}
@@ -101,13 +88,13 @@
                 </div>
 	    	</div>
     	</div> #}
-        {{ base.action(URL.site('teacher/create/discipline'),
+        {{ base.action(URL.site('discipline/create/'),
                         URL.site('media/img/addList.png'),
                         'Создать новую дисциплину',
                         'Добавить в систему '~System.Title~' дисциплину. '~
                         'Этот шаг включает в себя создание УКД, добавление преподавателей, присоединение групп и '~
                         'выбор определенных студентов, которые будут подписаны на дисциплину.') }}
-        {{ base.action(URL.site('teacher/create/coursework'),
+        {{ base.action(URL.site('coursework/create/'),
                         URL.site('media/img/addList.png'),
                         'Создать курсовую работу',
                         'Добавить в систему '~System.Title~' дисциплину типа курсовая научная работа '~
@@ -115,7 +102,7 @@
 
         <div class="semesterMargin">
             <div class="semesterLayer">
-                {{ base.SemesterSwitcher(Semester, SemesterList) }}
+                {{ base.SemesterSwitcher(SemesterList) }}
             </div>
             {#<div class="helpLink">
                 <a href="#">Справка</a>
@@ -132,7 +119,23 @@
             </tr>
         </table>#}
         {% for Subject in Subjects %}
-            {{ idx.outputSubject(Subject, HTML) }}
+            <div class="discipline">
+                <div class="discipline_groups">
+                    <div class="grade_title">
+                        {{ Subject.SubjectName }}
+                        {% if Subject.GradeNum > 0 %}| {{ Rus[Subject.Degree] }}, {{ Subject.GradeNum }} РєСѓСЂСЃ
+                        {% endif %}
+                    </div>
+
+                    <div class="group_table">
+                        <table cellspacing="0" border="0" width="100%">
+                            {% for Dis in Subject.Disciplines %}
+                                {{ self.outputDiscipline(Dis, Groups, Teachers) }}
+                            {% endfor %}
+                        </table>
+                    </div>
+                </div>
+            </div>
         {% else %}
             <h2 style="text-align: center;">В настоящий момент Вы не подписаны ни на одну из существующих дисциплин.</h2>
         {% endfor %}
diff --git a/~dev_rating/application/views/teacher/rating.twig b/~dev_rating/application/views/teacher/rating.twig
index 3a471d87598081ce35e16fb666d229b676266263..d1d4ff02f7163f55fe56ece2d4ced1f08bc31177 100644
--- a/~dev_rating/application/views/teacher/rating.twig
+++ b/~dev_rating/application/views/teacher/rating.twig
@@ -11,23 +11,23 @@
 
 {% block main_top_title %}Выставление баллов{% endblock %}
 {% block main_content %}
-	{% if disciplineInfo.Milestone > 0 %}
+	{% if Discipline.Milestone > 0 %}
 		<p class="canNotEdit">
 			Семестр завершен. Выставление баллов <u>запрещено</u>.
 		</p>
 	{% endif %}
 	{#
-    {% if disciplineInfo.ExamType == 'exam' %}
+    {% if Discipline.Type == 'exam' %}
         <p class="canNotEdit">
             Выставление баллов за экзамен возможно только на странице "Сессия".
         </p>
     {% endif %}
     #}
-	<h2 class="h2_titleSubject">{{ disciplineInfo.SubjectName }}</h2>
+	<h2 class="h2_titleSubject">{{ Discipline.SubjectName }}</h2>
 
 	<button class="downloadExcel" style="display: none">Скачать в excel формате [dev version]</button>
 
-	{{ HTML.anchor('exam/'~disciplineInfo.DisciplineID,
+	{{ HTML.anchor('exam/'~Discipline.ID,
 	"Перейти к сессии →",
 	{'title': 'Сессия', 'class': 'exam_a'})|raw }}
 
@@ -125,7 +125,7 @@
 					<td id="student_{{ student.ID }}" class="studentCell staticCell">{{ student.LastName }} {{ student.FirstName }}</td>
 					{% for i in 1..CellCount %}
 						{% set j = j + 1 %}
-						{% if student.Rates[i].SubmoduleID >= 0 and disciplineInfo.Milestone == 0  %}
+						{% if student.Rates[i].SubmoduleID >= 0 and Discipline.Milestone == 0  %}
 							<td id="col_{{ j }}" class="commonCell">
 								<input type="text" value="{{ student.Rates[i].Rate }}">
 							</td>
@@ -156,8 +156,8 @@
 			<span id="maxRate">Максимальный балл: <b></b></span>
 		</div>
 	</div>
-	<div id="hidden_div">
-		{{ disciplineInfo_JSON|raw }}
+	<div id="hidden_div" style="display: none;">
+		{{ Discipline_JSON|raw }}
 	</div>
 	<input type="hidden" id="pageType" value="rating"/>
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/~dev_rating/deploy.php b/~dev_rating/deploy.php
index 71cb15a88a1e531058911b80556604e83057ef77..e712f596e18a49a9536f447954d349877e30b1a5 100644
--- a/~dev_rating/deploy.php
+++ b/~dev_rating/deploy.php
@@ -1,23 +1,20 @@
 <?php defined('SYSPATH') OR die('No direct access allowed.');
 
-    if(!is_dir(APPPATH.'config'))
-    {
-        mkdir(APPPATH.'config');
-        if(!copy(CFGPATH.'database.php', APPPATH.'config/database.php'))
-                echo 'Беда!';
-        if(!copy(CFGPATH.'security.php', APPPATH.'config/security.php'))
-                echo 'Беда!';
-        if(!copy(CFGPATH.'twig.php', APPPATH.'config/twig.php'))
-                echo 'Беда!';   
-        if(!copy(CFGPATH.'session.php', APPPATH.'config/session.php'))
-                echo 'Беда!';  
+if (!is_dir(APPPATH . 'config')) {
+    mkdir(APPPATH . 'config');
+
+    $arr = ['database.php', 'security.php', 'twig.php', 'session.php', 'general.json'];
+
+    foreach ($arr as $name) {
+        if (!copy(CFGPATH . $name, APPPATH . 'config/' . $name))
+            echo 'Беда!';
     }
-    
-    if(!is_dir(APPPATH.'logs/'))
-        mkdir(APPPATH.'logs');
-    
-    if(!is_dir(APPPATH.'cache/'))
-    {
-        mkdir(APPPATH.'cache');
-        mkdir(APPPATH.'cache/twig');
-    }
\ No newline at end of file
+}
+
+if (!is_dir(APPPATH . 'logs/'))
+    mkdir(APPPATH . 'logs');
+
+if (!is_dir(APPPATH . 'cache/')) {
+    mkdir(APPPATH . 'cache');
+    mkdir(APPPATH . 'cache/twig');
+}
\ No newline at end of file
diff --git a/~dev_rating/deployConfig/database.php b/~dev_rating/deployConfig/database.php
index 3da6bbe0e39940103a3936be8c830a7c990dc869..73f0a6bb167d1186e641a5ece060a82466e3d18b 100644
--- a/~dev_rating/deployConfig/database.php
+++ b/~dev_rating/deployConfig/database.php
@@ -13,7 +13,7 @@ return array
 			 * string   password    database password
 			 * boolean  persistent  use persistent connections?
 			 */
-			'dsn'        => 'mysql:host=localhost;dbname=mmcs_rating',
+			'dsn'        => 'mysql:host=127.0.0.1;dbname=mmcs_rating',
 			'username'   => 'mmcs_rating',
 			'password'   => 'Pefnesdy',
 			'persistent' => FALSE,
diff --git a/~dev_rating/deployConfig/general.json b/~dev_rating/deployConfig/general.json
new file mode 100644
index 0000000000000000000000000000000000000000..beb5f67aecd151339c42354e6d3f0ab78fa16484
--- /dev/null
+++ b/~dev_rating/deployConfig/general.json
@@ -0,0 +1,9 @@
+{
+  "SemesterID": 1,
+  "HashKey": "sdhrhsdrh",
+  "Maintenance": {
+      "active": 0,
+      "return": "info stub"
+  },
+  "Logging": true
+}
\ No newline at end of file
diff --git a/~dev_rating/docs/template credit.xls b/~dev_rating/docs/template credit 0 1.xls
similarity index 99%
rename from ~dev_rating/docs/template credit.xls
rename to ~dev_rating/docs/template credit 0 1.xls
index b069b5889a61815c3a43b38f34fa8775c8c731e3..995bcaec860753ce6c713f38f816a19aab141fd9 100644
Binary files a/~dev_rating/docs/template credit.xls and b/~dev_rating/docs/template credit 0 1.xls differ
diff --git a/~dev_rating/docs/template exam.xls b/~dev_rating/docs/template credit 2 3.xls
similarity index 78%
rename from ~dev_rating/docs/template exam.xls
rename to ~dev_rating/docs/template credit 2 3.xls
index 9943271dd566c079781845a426c77d1fa4e6b1a0..6e54b1db3ede36de742942f40112c012e6edd8ee 100644
Binary files a/~dev_rating/docs/template exam.xls and b/~dev_rating/docs/template credit 2 3.xls differ
diff --git a/~dev_rating/docs/template exam 0 1.xls b/~dev_rating/docs/template exam 0 1.xls
new file mode 100644
index 0000000000000000000000000000000000000000..8d0684d1094a86b778b362e9c4deb0422014987b
Binary files /dev/null and b/~dev_rating/docs/template exam 0 1.xls differ
diff --git a/~dev_rating/docs/template exam 2 3.xls b/~dev_rating/docs/template exam 2 3.xls
new file mode 100644
index 0000000000000000000000000000000000000000..60373f5f4e24055abd67e0635e01e78e4381bf24
Binary files /dev/null and b/~dev_rating/docs/template exam 2 3.xls differ
diff --git a/~dev_rating/media/css/readme.md b/~dev_rating/media/css/readme.md
new file mode 100644
index 0000000000000000000000000000000000000000..2bae7627bfc6692cc3ba2628ddf1d1863d2f10fd
--- /dev/null
+++ b/~dev_rating/media/css/readme.md
@@ -0,0 +1,3 @@
+We use [LESS](http://tinyurl.com/o4o6qkm), so look at the `media/less` folder.
+
+Every file at this directory will be removed soon.
\ No newline at end of file
diff --git a/~dev_rating/media/js/admin/students/index.js b/~dev_rating/media/js/admin/students/index.js
index 9954084f8cbc8eaaa860b879ace1bf0a06d363fe..1db45c0555853eb1d62a144fd879e4dd82ca6851 100644
--- a/~dev_rating/media/js/admin/students/index.js
+++ b/~dev_rating/media/js/admin/students/index.js
@@ -1,79 +1,111 @@
 $(function()
 {
-    $("#facultySelect [value='0']").attr('selected', 'selected');
-    $("#gradeSelect [value='0']").attr('selected', 'selected');
-    $("#groupSelect [value='0']").attr('selected', 'selected');
+    var jFaculty = $('#facultySelect');
+    var jGrade = $('#gradeSelect');
+    var jGroup = $('#groupSelect');
     
-    $('#gradeSelect').attr('disabled', 'disabled');
-    $('#groupSelect').attr('disabled', 'disabled');
+    jFaculty.find("[value='0']").attr('selected', 'selected');
+    jGrade.find("[value='0']").attr('selected', 'selected');
+    jGroup.find("[value='0']").attr('selected', 'selected');
     
+    jGrade.attr('disabled', 'disabled');
+    jGroup.attr('disabled', 'disabled');
+
+
     // Переключение страниц
-    $('body').on('click', '.paginatorLink', function(){
+    $('body').on('click', '.paginatorLink', function() {
         $('.paginatorPage').addClass('hiddenPage');
         $('.paginator_item').removeClass('selectedPageNum');
-        $('#'+this.id).removeClass('hiddenPage');
+        $('#' + this.id).removeClass('hiddenPage');
         $(this).children('.paginator_item').addClass('selectedPageNum');
-    });    
+    });
     
     // Выбор факультета
-    $('#facultySelect').change(function(){
-        //getStudentsList();
-        if (($('#facultySelect option:selected').val()!= '0')) {
-                $('#gradeSelect').removeAttr('disabled');
-        }
-        else
-        {
-            $('#gradeSelect').attr('disabled', 'disabled');
+    jFaculty.change(function() {
+        if ((jFaculty.find('option:selected').val() != '0')) {
+            jGrade.removeAttr('disabled');
+        } else {
+            jGrade.attr('disabled', 'disabled');
         }
 
-        $('#groupSelect').attr('disabled', 'disabled');
-        $("#studyGroupSelect").html('<option value="0">--- Учебная группа ---</option>');
-
-    });
+        jGroup.attr('disabled', 'disabled');
+        $("#studyGroupSelect").html('<option value="0">— Учебная группа —</option>');
+    }).change(searchStudents);
 
     // Выбор курса
-    $('#gradeSelect').change(function(){
-        //getStudentsList();
-        $('#groupSelect').attr('disabled', 'disabled');
-        $("#groupSelect").empty();
-        $("#groupSelect").html('<option value="0">--- Учебная группа ---</option>');
+    jGrade.change(function() {
+        jGroup.attr('disabled', 'disabled');
+        jGroup.empty();
+        jGroup.html('<option value="0">— Учебная группа —</option>');
 
-        if (($('#gradeSelect option:selected').val()!= '0')) {
-            
-            $.post(URLdir + 'handler/admStudents/getGroups',
-            {
-                'facultyID': $('#facultySelect option:selected').val(),
-                'gradeNum': $('#gradeSelect option:selected').val()
-            }, 
-            function(data){
-               $.each(data, function(i){
-                    //$("#groupSelect").append('<optgroup label="'+data[i].SpecName+'">');
-                    $.each(data[i].Groups, function(j)
-                    {
-                        $("#groupSelect").append('<option value="'+data[i].Groups[j].ID+'">'+data[i].Groups[j].Num+' РіСЂСѓРїРїР°</option>');
-                    });
-                    $("#groupSelect").append('</optgroup>');
-                });
-                $("#groupSelect").removeAttr("disabled");
-            }, "json");
-                
+        if ((jGrade.find('option:selected').val() != '0')) {
+            $.post(URLdir + 'handler/admStudents/getGroups', {
+                'facultyID': jFaculty.find('option:selected').val(),
+                'gradeNum': jGrade.find('option:selected').val()
+            }, updateGroupsList, "json");
         }
-    });
+    }).change(searchStudents);
+
+    function updateGroupsList(data) {
+        $.each(data, function(i) {
+            //jGroup.append('<optgroup label="'+data[i].SpecName+'">');
+            $.each(data[i].Groups, function(j) {
+                var group = data[i].Groups[j];
+                jGroup.append('<option value="' + group.ID + '">' + group.Num + ' РіСЂСѓРїРїР°</option>');
+            });
+            jGroup.append('</optgroup>');
+        });
+        jGroup.removeAttr("disabled");
+    }
     
     // Выбор группы
-    $('#groupSelect').change(getStudentsList);
+    jGroup.change(searchStudents);
+
+    // Search by name
+    var jStudentName = $("#studentName");
+    var prevNameValue = '';
+
+    var typewatch = (function() {
+        var timer = 0;
+        return function(callback, ms) {
+            clearTimeout(timer);
+            timer = setTimeout(callback, ms);
+        };
+    })();
+
+    var updateList = function(e) {
+        typewatch(function() {
+            if (prevNameValue != jStudentName.val())
+                searchStudents();
+            prevNameValue = jStudentName.val();
+            $(this).blur();
+        }, 700);
+    };
+
+    jStudentName
+        .keyup(updateList)
+        .bind("paste", updateList);
 
-    function getStudentsList()
-    {
+    function searchStudents() {
+        var arr = {
+            'facultyID' : +jFaculty.find('option:selected').val(),
+            'gradeID'   : +jGrade.find('option:selected').val(),
+            'groupID'   : +jGroup.find('option:selected').val(),
+            'name'      : jStudentName.val()
+        };
+
+        if (!arr.facultyID || !arr.gradeID)
+            return;
+        if (arr.name.length >= 3)
+            updateStudentsList('admStudents/getStudentsByName', arr);
+        else if (arr.groupID)
+            updateStudentsList('admStudents/getStudentsList', arr);
+    }
+
+    function updateStudentsList(method, params) {
         $("#search_results").html('<div class="search_load"><img src="' + URLdir + 'media/img/load.gif"/></div>');
-        $.post(URLdir + 'handler/admStudents/getStudentsList?dean',
-            {
-                'facultyID': $('#facultySelect option:selected').val(),
-                'gradeID': $('#gradeSelect option:selected').val(),
-                'groupID': $('#groupSelect option:selected').val()
-            },
-            function(data){
-                $("#search_results").html(data);
-            });
+        $.post(URLdir + 'handler/' + method, params, function(data) {
+            $("#search_results").html(data);
+        });
     }
 });
\ No newline at end of file
diff --git a/~dev_rating/media/js/admin/students/upload.js b/~dev_rating/media/js/admin/students/upload.js
index 00b3f58d54da165077d032053abbb82760e81b1d..b7113be60783e26a0fba0355851ac1f194ab7251 100644
--- a/~dev_rating/media/js/admin/students/upload.js
+++ b/~dev_rating/media/js/admin/students/upload.js
@@ -1,10 +1,9 @@
 $(function()
 {
-    $("#facultySelect [value='0']").attr('selected', 'selected');
-    
-    $('#facultySelect').change(function(){
-        if (($('#facultySelect option:selected').val()!= '0')) {
-            $('#SecondStep').css('display', 'block');
-        }
-    });     
+    var jFaculty = $('#facultySelect');
+
+    jFaculty.change(function() {
+        var item = jFaculty.find('option:selected').val();
+        $('#SecondStep').css('display', Number(item) ? 'block' : 'none');
+    });
 });
\ No newline at end of file
diff --git a/~dev_rating/media/js/dean_office/credits.js b/~dev_rating/media/js/dean_office/credits.js
index 67b335fed530d7f550722d3d9e7ebaf4ae617ffd..dc55a91f3d63cbe845adc94ba9a1ad4850f5341b 100644
--- a/~dev_rating/media/js/dean_office/credits.js
+++ b/~dev_rating/media/js/dean_office/credits.js
@@ -19,7 +19,7 @@ $(function() {
 
     function ChangeMilestoneForDiscipline(id, milestone)
     {
-        $.post(g_URLdir + "dean_office/credits/setCreditMilestone/" + id + ":" + milestone);
+        $.post(g_URLdir + "handler/credits/setCreditMilestone/" + id + ":" + milestone);
         for(var i = 0; i < 4; i++)
         {
             $('#MilestoneTitle-' + i).css('font-weight', '');
@@ -31,7 +31,7 @@ $(function() {
 
     function ChangeMilestoneForAllDisciplines(milestone)
     {
-        $.post(g_URLdir + "dean_office/credits/setMilestone/" + milestone);
+        $.post(g_URLdir + "handler/credits/setMilestone/" + milestone);
         for(var i = 0; i < 4; i++)
         {
             $('#MilestoneTitle-' + i).css('font-weight', '');
@@ -43,7 +43,7 @@ $(function() {
     function OutputDisciplineInfo(id)
     {
         $.post(
-            g_URLdir + "dean_office/credits/getInfo",
+            g_URLdir + "handler/credits/getInfo",
             {
                 "ID": id
             },
@@ -75,7 +75,7 @@ $(function() {
     function GetMilestoneForCredits()
     {
         $.post(
-            g_URLdir + "dean_office/credits/getMilestone",
+            g_URLdir + "handler/credits/getMilestone",
             function(data)
             {
                 for(var i = 0; i < 4; i++)
diff --git a/~dev_rating/media/js/dean_office/dean_office.js b/~dev_rating/media/js/dean_office/dean_office.js
index 5c9feb1d9f46da69b9b000acd556e7b53e9f26dd..bab3f791c7db583f8b5b3d447dbea4823c67c43f 100644
--- a/~dev_rating/media/js/dean_office/dean_office.js
+++ b/~dev_rating/media/js/dean_office/dean_office.js
@@ -84,9 +84,9 @@ $(function() {
                         jSelectDiscipline.html("<option>" + langNotChosen + "</option>");
                         for (i in d.data) {
                             discipline = d.data[i];
-                            if (discipline.ExamType !== 'exam')
-                                continue;
-                            jSelectDiscipline.append("<option value='" + discipline.DisciplineID + "'>" + discipline.SubjectName + "</option>");
+                            if (discipline.type !== 'exam')
+                                continue;  // todo: be careful with .type & .ID fields
+                            jSelectDiscipline.append("<option value='" + discipline.ID + "'>" + discipline.subjectName + "</option>");
                         }
                         if (i > 0)
                             jSelectDiscipline.removeAttr("disabled");
diff --git a/~dev_rating/media/js/discipline/CreateCoursework.js b/~dev_rating/media/js/discipline/CreateCoursework.js
index 1c91f7a7206e015cded6b12c76e07764fccb7c38..79d269dc0080f0acf01751f22cb1366bd2c4885d 100644
--- a/~dev_rating/media/js/discipline/CreateCoursework.js
+++ b/~dev_rating/media/js/discipline/CreateCoursework.js
@@ -1,52 +1,54 @@
 var $ = jQuery;
 $(function() {
+    const SCIENTIFIC = 'scientific_coursework';
+    const DISCIPLINARY = 'disciplinary_coursework';
+
     var INPUT_BORDER_COLOR = "#d7d7d7";
     var jSubjectSelect = $("select.SelectSubject");
     var jSubjectInput = $("input.InputSubject ");
     var jGradeSelect = $("select.SelectGrade");
-    var jType = $("input[name=type]");
+    var jType = $("input[name=subtype]");
 
     // Изменения базовых параметров дисциплины
     $(".AddDiscipline").click(function() {
         var self = $(this);
         self.attr("disabled", true);
 
+        var discipline = {
+            "subjectID": parseInt(jSubjectSelect.val()),
+            "gradeID": parseInt(jGradeSelect.val()),
+            "facultyID": $("select.SelectFaculty").val(),
+            "subtype": jType.filter(":radio:checked").val() == 'scientific' ? SCIENTIFIC : DISCIPLINARY
+        };
+
         var errCount = 0;
-        var subjectID = parseInt(jSubjectSelect.val());
 
-        var type = jType.filter(":radio:checked").val();
-        if (type === undefined) {
+        if (discipline.subtype === undefined) {
             jType.first().parent().parent().css("background-color", "#f2b4b4");
             ++errCount;
         }
 
-        if (type != 'scientific' && (!isNum(subjectID) || subjectID <= 0)) {
+        var incorrectID = (!isNum(discipline.subjectID) || discipline.subjectID <= 0);
+        if (incorrectID && discipline.subtype != SCIENTIFIC) {
             jSubjectInput.css("border-color", "red");
             ++errCount;
         }
 
-        var gradeID = parseInt(jGradeSelect.val());
-        if (!isNum(gradeID) || gradeID <= 0) {
+        if (!isNum(discipline.gradeID) || discipline.gradeID <= 0) {
             jGradeSelect.css("border-color", "red");
             ++errCount;
         }
 
         if (errCount === 0) {
             $.post(
-                g_URLdir + "handler/coursework/add",
-                {
-                    "subjectID": subjectID,
-                    "grade": gradeID,
-                    "type": type,
-                    "facultyID": $("select.SelectFaculty").val()
-                },
-                function(data) {
-                    data = $.parseJSON(data);
-                    if (data.success === true) {
-                        setTimeout("location.replace('" + g_URLdir + "discipline/structure/" + data.id + "')", 500);
-                    } else {
+                g_URLdir + "handler/courseWork/create", discipline, function(res) {
+                    var response = $.parseJSON(res);
+
+                    if (response.error) {
                         self.removeAttr("disabled");
-                        EventInspector_ShowMsg("Ошибка при добавлении дисциплины", "error");
+                        EventInspector_ShowMsg("Ошибка при добавлении курсовой", "error");
+                    } else {
+                        setTimeout("location.replace('" + g_URLdir + "discipline/" + response["response"].ID + "')", 200);
                     }
                 }
             );
@@ -69,10 +71,10 @@ $(function() {
 
     jType.change(function() {
         var value = jType.filter(":radio:checked").val();
-        if (value in ["scientific", "disciplinary"])
+        if (value in ['disciplinary', 'scientific'])
             $(this).parent().parent().css("background-color", "#fff");
 
-        if (value === "scientific") {
+        if (value === 'scientific') {
             jSubjectSelect.attr("disabled", "disabled");
             $("#subjects").fadeOut(500);
         } else {
diff --git a/~dev_rating/media/js/discipline/CreateDiscipline.js b/~dev_rating/media/js/discipline/CreateDiscipline.js
index 4c224cba9ed3a2a016cd82473389f811a9f627ae..bbc91a58678f941c8e0fe5d0549710e26af1d6ab 100644
--- a/~dev_rating/media/js/discipline/CreateDiscipline.js
+++ b/~dev_rating/media/js/discipline/CreateDiscipline.js
@@ -34,25 +34,26 @@ $(function() {
 
         if (errCount === 0) {
             $.post(
-                g_URLdir + "handler/map/AddDiscipline",
+                g_URLdir + "handler/discipline/create",
                 {
-                    "Grade": gradeID,
-                    "SubjectID": subjectID,
-                    "BonusRate": bonusRate,
-                    "ExamType": examType,
-                    "LectureCount": $("input.InputLectureCount").val(),
-                    "LabCount": $("input.InputLabCount").val(),
-                    "PracticeCount": $("input.InputPracticeCount").val(),
-                    "FacultyID": $("select.SelectFaculty").val()
+                    "gradeID": gradeID,
+                    "subjectID": subjectID,
+                    "facultyID": $("select.SelectFaculty").val(),
+                    "lectures": $("input.InputLectureCount").val(),
+                    "labs": $("input.InputLabCount").val(),
+                    "practice": $("input.InputPracticeCount").val(),
+                    "bonus": bonusRate,
+                    "type": examType
                 },
                 function(data)
                 {
-                    data = $.parseJSON(data);
-                    if(data.success === true) {
-                        setTimeout("location.replace('"+g_URLdir+"discipline/structure/"+data.DisciplineID+"')", 500);
+                    var answer = $.parseJSON(data);
+                    if (answer["response"]) {
+                        var url = g_URLdir + "discipline/" + answer["response"].ID;
+                        setTimeout("location.replace('" + url + "')", 500);
                     } else {
-                        jThis.removeAttr("disabled");
                         EventInspector_ShowMsg("Ошибка при добавлении дисциплины", "error");
+                        jThis.removeAttr("disabled");
                     }
                 }
             );
diff --git a/~dev_rating/media/js/discipline/DisciplineList.js b/~dev_rating/media/js/discipline/DisciplineList.js
index 8da800aa322c0e153b2ea743acd6fc282669afde..7a2e03dfae4b614200f3b366a2058908b830bdb4 100644
--- a/~dev_rating/media/js/discipline/DisciplineList.js
+++ b/~dev_rating/media/js/discipline/DisciplineList.js
@@ -1,29 +1,29 @@
+$ = jQuery;
 $(function() {
-
     // Удаление дисциплины
     $(".DeleteDiscipline").click(function() {
-        
+
         if (confirm('Вы действительно хотите удалить дисциплину?')) {
             var thisObj = $(this);
+            var id = parseInt($(this).attr('id'));
+
             $(this).attr("disabled", true);
             $.post(
-                g_URLdir + 'handler/map/DeleteDiscipline',
-                {
-                    'DisciplineID': parseInt($(this).attr('id'))
+                g_URLdir + 'handler/discipline/delete', {
+                    'id': id
                 },
-                function(data)
-                {
-                    data = $.parseJSON(data);
-                    if(data.success === true) {
+                function(data) {
+                    var response = $.parseJSON(data);
+                    if (response.error) {
+                        thisObj.removeAttr('disabled');
+                        EventInspector_ShowMsg('Ошибка при удалении дисциплины', 'error');
+                    } else {
                         EventInspector_ShowMsg('Дисциплина удалена', 'success');
                         var count = thisObj.parent().parent().parent().find('.group_block').size();
                         if (count < 2)
                             thisObj.closest('.discipline_groups').remove();
                         else 
                             thisObj.parent().parent().remove();
-                    } else {
-                        thisObj.removeAttr('disabled');
-                        EventInspector_ShowMsg('Ошибка при удалении дисциплины', 'error');
                     }
                 }
             );
diff --git a/~dev_rating/media/js/discipline/EditSettings.js b/~dev_rating/media/js/discipline/EditSettings.js
index bc605d2f49c7b4fe22055879dc02b32b88f577a5..1d85a0a3ee593b1d0107eb81aa608e5550c757bb 100644
--- a/~dev_rating/media/js/discipline/EditSettings.js
+++ b/~dev_rating/media/js/discipline/EditSettings.js
@@ -10,7 +10,7 @@ $(function() {
     var practiceCount = parseInt($("input.InputPracticeCount").val());
 
 
-// ---- Изменения базовых параметров дисциплины ---
+    // Изменения базовых параметров дисциплины
     $("select.SelectSubject").select2({allowClear: false});
     
     // Изменение предмета
diff --git a/~dev_rating/media/js/discipline/EditStudents.js b/~dev_rating/media/js/discipline/EditStudents.js
index 1e4e653dcecf97d33d01a7157ab5052c766aa98e..333cc1a6a982ec4c168e4d8c559cf8ee589fb395 100644
--- a/~dev_rating/media/js/discipline/EditStudents.js
+++ b/~dev_rating/media/js/discipline/EditStudents.js
@@ -91,7 +91,8 @@ $(function() {
             },
             function(searchResult){
                 var searchResult = $.parseJSON(searchResult);
-                var i = 0;
+                console.log(searchResult);
+                var i = -1;
                 jSearchResult.html("");
                 var jClone = jSearchResult.clone();
 
@@ -112,7 +113,7 @@ $(function() {
                     jCurGroup.append(jTempStudent);
                 }
 
-                if (i <= 0) {
+                if (searchResult.length <= 0) {
                     jSearchResult.append(jStudentEmptyPrototype.clone());
                 } else {
                     jSearchResult.replaceWith(jClone);
diff --git a/~dev_rating/media/js/discipline/EditTeachers.js b/~dev_rating/media/js/discipline/EditTeachers.js
index d829ca451342b6d09c67b11823aebde98b7e3c46..d0e1c851f94ab6b758272ad8cf139827ed5c2235 100644
--- a/~dev_rating/media/js/discipline/EditTeachers.js
+++ b/~dev_rating/media/js/discipline/EditTeachers.js
@@ -135,19 +135,19 @@ $(function() {
             var jThis = $(this);
             $(this).attr("disabled", true);
             $.post(
-                URLdir + "handler/map/DelegateDiscipline",
+                URLdir + "handler/discipline/delegate",
                 {
-                    "NewAuthorID": parseInt(jThis.parent().attr("id")),
-                    "DisciplineID": g_disciplineID
+                    'id': g_disciplineID,
+                    "teacherID": parseInt(jThis.parent().attr("id"))
                 },
                 function(data)
                 {
                     data = $.parseJSON(data);
-                    if(data.success === true) {
-                        setTimeout("location.replace('"+g_URLdir+"')", 100); 
-                    } else {
+                    if (data.response) {
                         jThis.removeAttr("disabled");
                         EventInspector_ShowMsg("Ошибка при передаче дисциплины", "error");
+                    } else {
+                        setTimeout("location.replace('"+g_URLdir+"')", 100); 
                     }
                 }
             );
@@ -161,21 +161,18 @@ $(function() {
         $(this).attr("disabled", true);
         var ID = $(this).parent().attr("id");
         $.post(
-            URLdir + "handler/map/UnbindTeacher",
+            URLdir + "handler/discipline/unbind",
             {
-                "BindingTeacher": ID,
-                "DisciplineID": g_disciplineID
+                'id': g_disciplineID,
+                "teacherID": ID
             },
             function(data){
                 data = $.parseJSON(data);
-                if(data.success === true) {
-                    jThis
-                        .parent()
-                        .remove();
-                }
-                else {
+                if(data.error) {
                     EventInspector_ShowMsg("Ошибка при отсоединении преподавателя", "error");
                     jThis.removeAttr("disabled");
+                } else {
+                    jThis.parent().remove();
                 }
             }
         );
@@ -188,22 +185,19 @@ $(function() {
         var ID = $(this).parent().attr("id");
         var Name = $(this).siblings(".Name").text();
         $.post(
-            URLdir + "handler/map/BindTeacher",
+            URLdir + "handler/discipline/bind",
             {
-                "BindingTeacher": ID,
-                "DisciplineID": g_disciplineID
+                'id': g_disciplineID,
+                "teacherID": ID
             },
             function(data){
                 data = $.parseJSON(data);
-                if(data.success === true) {
-                    $(".BindTeachersList").append(AddTeacher(ID, Name, "Unbind"));
-                    jThis
-                        .parent()
-                        .remove();
-                }
-                else {
+                if (data.error) {
                     EventInspector_ShowMsg("Ошибка при прикреплении преподавателя", "error");
                     jThis.removeAttr("disabled");
+                } else {
+                    $(".BindTeachersList").append(AddTeacher(ID, Name, "Unbind"));
+                    jThis.parent().remove();
                 }
             }
         );
diff --git a/~dev_rating/media/js/discipline/general.js b/~dev_rating/media/js/discipline/general.js
index 0418f70db0622c3dfc02f712515a2a5422164eca..f97e7751479ea370027f807247bd012fdff801b6 100644
--- a/~dev_rating/media/js/discipline/general.js
+++ b/~dev_rating/media/js/discipline/general.js
@@ -1,12 +1,12 @@
 var g_URL;
-var g_disciplineID;
+//var g_disciplineID;
 var g_facultyID;
 var $ = jQuery;
 $(function() {
     var selectSubject = $("select.SelectSubject").first();
     g_URL = (window.location.href).split("/");
-    g_disciplineID = g_URL[g_URL.length - 1];
-    DisciplineID = g_disciplineID;
+    //g_disciplineID = g_URL[g_URL.length - 1];
+    //DisciplineID = g_disciplineID;
     
     // Получить список в память
     function GetSubjectsList()
diff --git a/~dev_rating/media/js/profile.js b/~dev_rating/media/js/profile.js
index 951bea84692d9680319ad6bd41983ef42fa5ffa1..cb2eb9e03d23ffef5cc7b0f3282bbf3c4bd79852 100644
--- a/~dev_rating/media/js/profile.js
+++ b/~dev_rating/media/js/profile.js
@@ -58,7 +58,7 @@ $(function()
                         if(data.success === true)
                         {                          
                             $('.popup_overlay').css('display', 'none');
-                            location.reload();
+                            //location.reload();
                             setSessionTimer(15);
                         }
                         else
diff --git a/~dev_rating/media/js/rating.js b/~dev_rating/media/js/rating.js
index dd5740410a2ecf72f519cc796ac01af0382b5dbe..50d973b0ccb29bb178518eab4e5b07dc1aea5503 100644
--- a/~dev_rating/media/js/rating.js
+++ b/~dev_rating/media/js/rating.js
@@ -1,70 +1,146 @@
 var $ = jQuery;
 
-$(function() {
+$(function () {
+    // Секция инициализации
+    var optionsViewData = {
+        'absence': {
+            sendingOption: 'absence',
+            messageOK: 'Неявка выставлена',
+            messageFail: 'Установка неявки не удалась'
+        },
+        'absence_unset': {
+            sendingOption: null,
+            messageOK: 'Неявка отменена',
+            messageFail: 'Отмена неявки не удалась'
+        },
+        'pass': {
+            sendingOption: 'pass',
+            messageOK: 'Автомат выставлен',
+            messageFail: 'Установка автомата не удалась'
+        },
+        'pass_unset': {
+            sendingOption: null,
+            messageOK: 'Автомат отменен',
+            messageFail: 'Отмена автомата не удалась'
+        }
+    };
+    var json_settings = $.parseJSON($("#hidden_div").html());
+    var pageType = $("#pageType").val();
+    var cancelFlag = false;
+    var g_col;
+    var g_row;
+    var g_isFocusCell = false; // Стоит фокус на ячейки или нет
+    var g_oldRateCell = null;
+    var g_submoduleID = null;
+    var g_studentID = null;
+    var g_submoduleTitle = "";
+    var g_submoduleMaxRate = 0;
+    var g_stdName = "";
+
+    var jCommonCell = $('.commonCell');
+    var jTdInfo_wrap = $("#tdInfo_wrap");
+    var jTdInfo = jTdInfo_wrap.children('#tdInfo');
+    var g_URL = (window.location.href).split("/");
+    var g_disciplineID = g_URL[g_URL.length - 1];
+
+    // on page loaded
+    // Настройки дисциплины:
+    // + ID - id дисциплины
+    // + studyGroupID_Filter - studyGroupID для фильтра (Эффект памяти)
+
+    controlVisualization();
+    $("div.main_content").ready(AdjustTable);
+    $(window).resize(AdjustTable);
+
+    $("#hidden_div").remove();
+    filterGroups(json_settings.GroupID_Filter);
+    $(".groupSelector [value='" + json_settings.GroupID_Filter + "']").attr("selected", "selected");
 
     function AdjustTable() {
         var jWrap = $('div.main_layer');
         var jTable = $("div.main_content");
         var tableWidth = jTable.get(0).scrollWidth;
         // check scroll bar
-        if (tableWidth <= jTable.width()+10) {
+        if (tableWidth <= jTable.width() + 10) {
             return;
         }
 
         //correct
         tableWidth *= 1.1;
         var maxWidth = $(window).width() * 0.95;
-        var newWidth = (tableWidth > maxWidth)?maxWidth:tableWidth;
+        var newWidth = (tableWidth > maxWidth) ? maxWidth : tableWidth;
         jWrap.css("max-width", newWidth);
     }
 
-    $("div.main_content").ready(AdjustTable);
-    $(window).resize(AdjustTable);
-
     function controlRowVisualization(jRow) {
+
+        if ((pageType !== "exam") || (json_settings.ExamType !== "exam")) {
+            return;
+        }
+
         var jAutoPassCheckBox = jRow.children(".autoPass").children(".autoPassCheck");
+        var jAbsenceCheckBoxes = jRow.children(".absenceCell").children(".absenceCheck");
+        var jExtraInputs = jRow.children(".additionalCell").children(".extra");
         var semesterRate = parseInt(jRow.children(".semesterRateResultCell").text());
-        var absence = jRow.children(".absenceCell").children(".absenceCheck").is(":checked");
-        if ((semesterRate < 60) || (absence))
+        var autopass = jAutoPassCheckBox[0].checked;
+        var absence = jAbsenceCheckBoxes[0].checked;
+        if ( semesterRate < 60 || absence ) {
             jAutoPassCheckBox.attr("disabled", true);
-        else
+        } else {
             jAutoPassCheckBox.removeAttr("disabled");
-    }
-
-    function controlVisualization() {
-        $(".autoPassCheck")
-            .each( function() {
-                controlRowVisualization($(this).parent().parent());
-            });
-    }
+        }
 
-    controlVisualization();
+        // суммарный добор
+        var extra = 0;
+        jExtraInputs.each(function() {
+            extra += $(this).val();
+        });
 
-    // on page loaded
-    //controlVisualization();
+        // чекбоксы влияют на соседей
+        var row = parseInt(jRow.attr('id').substr(4)); // одинаковая для всех
+        var otherDisabled = false;
+        var firstInARow = true;
+        jAbsenceCheckBoxes.each(function() {
+            var id = $(this).parent().attr('id');
+            var col = parseInt(id.substr(8));
+            var neighborExam = $("#col_"+col+"_row_"+row);
+
+            $(this).removeAttr("disabled");
+            if (autopass || // автомат
+                ( firstInARow && (semesterRate < 38) ) || // задолженник
+                ( semesterRate + extra < 38 )) // задолженник до сих пор
+            {
+                $(this).attr("disabled", true);
+            }
 
-    var g_col;
-    var g_row;
-    var g_isFocusCell = false; // Стоит фокус на ячейки или нет
-    var g_oldRateCell = null;
-    var g_submoduleID = null;
-    var g_studentID = null;
-    var g_submoduleTitle = "";
-    var g_submoduleMaxRate = 0;
-    var g_stdName = "";
-    var jTdInfo_wrap = $("#tdInfo_wrap");
-    var jTdInfo = jTdInfo_wrap.children('#tdInfo');
+            // TODO: условия этого и предыдущего if вынести в отдельную функцию, проверяющую допустимость
+            if (($(this)[0].checked) || autopass || otherDisabled) { // автомат, неявка или сдал до этого
+                neighborExam.children().attr("disabled", true);
+            } else {
+                if ((firstInARow && (semesterRate < 38)) || // задолженник
+                    (semesterRate + extra < 38))  // задолженник до сих пор
+                {
+                    neighborExam.children().attr("disabled", true);
+                } else {
+                    neighborExam.children().removeAttr("disabled");
+                    if (neighborExam.children().val() === "") {
+                        otherDisabled = true;
+                    }
+                }
+            }
 
-    var g_URL = (window.location.href).split("/");
-    var g_disciplineID = g_URL[g_URL.length - 1];
+            firstInARow = false;
+        });
+    }
 
-    // Настройки дисциплины:
-    // + ID - id дисциплины
-    // + studyGroupID_Filter - studyGroupID для фильтра (Эффект памяти)
-    var json_settings = $.parseJSON($("#hidden_div").html());
-    $("#hidden_div").remove();
-    filterGroups(json_settings.GroupID_Filter);
-    $(".groupSelector [value='"+ json_settings.GroupID_Filter +"']").attr("selected", "selected");
+    function controlVisualization() {
+        $(".studentsRate").children().children("tr")
+            .each(function () {
+                if (($(this).prop("id") !== "") && ($(this).attr("id").substr(0, 3) === "row")) {
+                    controlRowVisualization($(this));
+                }
+            });
+    }
 
     // Скрываем все остальные группы
     // 0 - показать все
@@ -72,13 +148,13 @@ $(function() {
         if (groupID == 0) {
             $(".studentsRate tbody")
                 .children()
-                .each( function() {
+                .each(function () {
                     $(this).show();
                 });
         } else {
             $(".studentsRate tbody")
                 .children(":gt(2)")
-                .each( function() {
+                .each(function () {
                     if ($(this).hasClass("group_" + groupID))
                         $(this).show();
                     else
@@ -88,24 +164,24 @@ $(function() {
     }
 
     // Ставим подстветку
-    function TdFocus(jThis){
+    function TdFocus(jThis) {
         g_col = jThis.attr('id');
         g_col = parseInt(g_col.substr(4));
         g_row = jThis.parent('tr').attr('id');
         g_row = parseInt(g_row.substr(4));
 
         g_oldRateCell = jThis.children("input").val();
-        $("td#col_" + g_col + ".commonCell").each(function(){
+        $("td#col_" + g_col + ".commonCell").each(function () {
             $(this).children('input').css("background-color", "#f1f1f1");
         });
-        $("td#col_" + g_col + ".staticCell").each(function(){
+        $("td#col_" + g_col + ".staticCell").each(function () {
             $(this).children('input').css("background-color", "#f1f1f1");
         });
 
-        $("tr#row_" + g_row + " .commonCell").each(function(){
+        $("tr#row_" + g_row + " .commonCell").each(function () {
             $(this).children('input').css("background-color", "#f1f1f1");
         });
-        $("tr#row_" + g_row + " .staticCell").each(function(){
+        $("tr#row_" + g_row + " .staticCell").each(function () {
             $(this).css("background-color", "#f1f1f1");
             $(this).children('input').css("background-color", "#f1f1f1");
         });
@@ -113,18 +189,18 @@ $(function() {
     }
 
     // Убираем подстветку
-    function TdUnFocus(){
-        $("td#col_" + g_col + ".commonCell").each(function(){
+    function TdUnFocus() {
+        $("td#col_" + g_col + ".commonCell").each(function () {
             $(this).children('input').css("background-color", "#fff");
         });
-        $("td#col_" + g_col + ".staticCell").each(function(){
+        $("td#col_" + g_col + ".staticCell").each(function () {
             $(this).children('input').css("background-color", "#fff");
         });
 
-        $("tr#row_" + g_row + " .commonCell").each(function(){
+        $("tr#row_" + g_row + " .commonCell").each(function () {
             $(this).children('input').css("background-color", "#fff");
         });
-        $("tr#row_" + g_row + " .staticCell").each(function(){
+        $("tr#row_" + g_row + " .staticCell").each(function () {
             $(this).css("background-color", "#fff");
             $(this).children('input').css("background-color", "#fff");
         });
@@ -137,19 +213,18 @@ $(function() {
             disciplinePassRate = 38;
 
         // Получаем подмодуль
-        var jCurSubmoduleInfo = $(".RatingTableSubmodulesInfo .col_"+g_col+":first");
-        var jCurSubmoduleHead = $(".RatingTableSubmodulesHead .col_"+g_col+":first");
+        var jCurSubmoduleInfo = $(".RatingTableSubmodulesInfo .col_" + g_col + ":first");
+        var jCurSubmoduleHead = $(".RatingTableSubmodulesHead .col_" + g_col + ":first");
 
         g_submoduleID = parseInt(jCurSubmoduleInfo.attr("id"));
         g_submoduleTitle = jCurSubmoduleHead.text();
-        if (jCurSubmoduleHead.length < 1 && $(".RatingTableModulesHead .bonus").length > 0 )
+        if (jCurSubmoduleHead.length < 1 && $(".RatingTableModulesHead .bonus").length > 0)
             g_submoduleTitle = 'Бонусные баллы';
-        g_submoduleMaxRate = parseInt($(".RatingTableSubmodulesHeadMaxRate .col_"+g_col).text());
+        g_submoduleMaxRate = parseInt($(".RatingTableSubmodulesHeadMaxRate .col_" + g_col).text());
 
 
         // Проверяем допустимое значение (только для добора)
-        if (jThis.attr("class").indexOf("additionalCell") >= 0)
-        {
+        if (jThis.attr("class").indexOf("additionalCell") >= 0) {
             var semesterRate = parseInt(jThis.siblings(".semesterRateResultCell").text());
             if (semesterRate <= disciplinePassRate)
                 g_submoduleMaxRate = disciplinePassRate - semesterRate;
@@ -172,7 +247,7 @@ $(function() {
         //  jThis.append("<div class='tdInfo'>"+g_submoduleTitle+"<br>"+g_stdName+"</div>");
     }
 
-    function UnsetTdInfo(jThis){
+    function UnsetTdInfo(jThis) {
         //jThis.children(".tdInfo").remove();
         jTdInfo_wrap.hide();
         g_submoduleID = null;
@@ -182,108 +257,95 @@ $(function() {
 
     function Rating(jThis, oldRate) {
         oldRate = parseInt(oldRate);
+
         // Здесь jThis - div rateCell, а не input, который является дочкой
-        jThis.children("input").attr("disabled", true);
+        if (cancelFlag) {
+            var str = ""
+            if (oldRate != -1)
+                str = oldRate;
+            jThis.children("input").val(str);
+            cancelFlag = false;
+            return;
+        }
 
-        var newRate = 0;
+        var newRate = -1; // если пустая строка в ячейке, значит ничего не поставлено
         if (jThis.children("input").val() !== "")
             newRate = parseInt(jThis.children("input").val());
+        if (newRate == oldRate)
+            return;
+
+        // блокируем ячейку пока не обработаем коллбек
+        jThis.children("input").attr("disabled", true);
+
         var rateResult = newRate;
 
         // считаем баллы по строке
-        if ($("#pageType").val() === "exam") //(jThis.attr("class").indexOf("attemptCell") >= 0)
+        if (pageType === "exam") //(jThis.attr("class").indexOf("attemptCell") >= 0)
         {
             // страница сессии
             rateResult += parseInt(jThis.siblings(".semesterRateResultCell").text());
+            rateResult += parseInt(jThis.siblings(".bonus").text());
 
-            jThis.siblings(".additionalCell").each(function(){
+            jThis.siblings(".additionalCell").each(function () {
                 if ($(this).children("input").val() !== "")
                     rateResult += parseInt($(this).children("input").val());
             });
         }
-        else if ($("#pageType").val() === "rating")
-        {
+        else if (pageType === "rating") {
             // страница оценивания
-            jThis.siblings(".commonCell").each(function(){ // добавим сумму баллов в соседних ячейках
+            jThis.siblings(".commonCell").each(function () { // добавим сумму баллов в соседних ячейках
                 var rate = $(this).children("input").val();
                 if (rate)
                     rateResult += parseInt(rate);
             });
-            var examRateStr = jThis.siblings(".examCell").children("p").text();
-            if (examRateStr)
-                rateResult += parseInt(examRateStr);
+
             var additionalRateStr = jThis.siblings(".staticCell").children("p").text();
             if (additionalRateStr)
                 rateResult += parseInt(additionalRateStr);
         }
 
-
-        if (newRate <= g_submoduleMaxRate)
-        {
-
+        if (newRate <= g_submoduleMaxRate) {
             $.ajax({
                 type: "POST",
                 url: URLdir + "handler/rating/setRate",
-                data: "student="+g_studentID+"&submodule="+g_submoduleID+"&rate="+newRate,
-                complete: function(jqXHR, textStatus) {
-                    switch(jqXHR.status) {
-                    case  403:
-                        EventInspector_ShowMsg("Сессия истекла", "error");
-                        jThis.children("input").val(oldRate);
-                        jThis.children("input").removeAttr("disabled");
-                        window.location.replace(URLdir);
-                        break;
-                    case 200:
-                        data = $.parseJSON(jqXHR.responseText);
-                        if(data.success === true) {
-                            var correctRate = (rateResult > 100) ? '100+' : rateResult;
-                            jThis.siblings(".rateResultCell").text(correctRate);
-
-                            // Открываем доступ к след. ячейке добора баллов
-                            if (jThis.hasClass("additionalCell")) {
-                                nextAdditionalCell = $("#col_" + (g_col + 1) + "_row_" + g_row);
-                                placeholder_max = (rateResult <= 60) ? (60 - rateResult) : (60 - oldRate);
-
-                                if (placeholder_max > 0 && nextAdditionalCell.hasClass("additionalCell")) {
-                                    	nextAdditionalCell.find("input").attr("placeholder", "макс. " + (placeholder_max));
-                                    	nextAdditionalCell.find("input").removeAttr("disabled");
+                data: "studentID=" + g_studentID + "&submoduleID=" + g_submoduleID + "&rate=" + newRate,
+                complete: function (jqXHR, textStatus) {
+                    switch (jqXHR.status) {
+                        case  403:
+                            EventInspector_ShowMsg("Сессия истекла", "error");
+                            jThis.children("input").val(oldRate);
+
+                            window.location.replace(URLdir);
+                            break;
+                        case 200:
+                            data = $.parseJSON(jqXHR.responseText);
+                            if (data.success === true) {
+                                var correctRate = (rateResult > 100) ? '100+' : rateResult;
+                                jThis.siblings(".rateResultCell").text(correctRate);
+
+                                // Открываем доступ к след. ячейке добора баллов
+                                if (jThis.hasClass("additionalCell")) {
+                                    nextAdditionalCell = $("#col_" + (g_col + 1) + "_row_" + g_row);
+                                    placeholder_max = (rateResult <= 60) ? (60 - rateResult) : (60 - oldRate);
+
+                                    if (placeholder_max > 0 && nextAdditionalCell.hasClass("additionalCell")) {
+                                        nextAdditionalCell.find("input").attr("placeholder", "макс. " + (placeholder_max));
+                                    }
                                 }
-                            }
-
-                            EventInspector_ShowMsg("Балл добавлен/изменен", "success");
-                        }
-                        else EventInspector_ShowMsg("Не удалось добавить/изменить балл", "error");
-                        jThis.children("input").removeAttr("disabled");
-                        break;
-                    default:
-                        EventInspector_ShowMsg(" "+statusCode, "success");
-                    }
 
+                                EventInspector_ShowMsg("Балл добавлен/изменен", "success");
+                            }
+                            else EventInspector_ShowMsg("Не удалось добавить/изменить балл", "error");
+                            break;
+                        default:
+                            EventInspector_ShowMsg(" " + jqXHR.status, "error");
                     }
-                //statusCode: {
-                //    403: function() {
-                //        EventInspector_ShowMsg("Сессия истекла", "error");
-                //        jThis.children("input").val(oldRate);
-                //        jThis.children("input").removeAttr("disabled");
-                //        window.location.replace(URLdir);
-                //    },
-                //    200: function(data) {
-                //        data = $.parseJSON(data);
-                //        if(data.success === true) {
-                //            var correctRate = (rateResult > 100) ? '100+' : rateResult;
-                //            jThis.siblings(".rateResultCell").text(correctRate);
-                //            EventInspector_ShowMsg("Балл добавлен/изменен", "success");
-                //        }
-                //        else EventInspector_ShowMsg("Не удалось добавить/изменить балл", "error");
-                //        jThis.children("input").removeAttr("disabled");
-                //    }
-                //}
+                }
             });
         }
         else {
-            if (oldRate <= g_submoduleMaxRate)
-            {
-                if(oldRate != -1)
+            if (oldRate <= g_submoduleMaxRate) {
+                if (oldRate != -1)
                     jThis.children("input").val(oldRate);
                 else
                     jThis.children("input").val("");
@@ -292,48 +354,35 @@ $(function() {
                 jThis.children("input").val("0");
 
             EventInspector_ShowMsg("Текущий балл превышает максимальный для данного модуля", "error");
-            jThis.children("input").removeAttr("disabled");
         }
+        jThis.children("input").removeAttr("disabled");
     }
 
-    $(".commonCell").mouseenter(function(){
+    jCommonCell.mouseenter(function () {
         if (g_isFocusCell === false)
             TdFocus($(this));
     });
 
-    $(".commonCell").mouseleave(function(){
+    jCommonCell.mouseleave(function () {
         if (g_isFocusCell === false)
             TdUnFocus();
     });
 
     var oldRate = 0;
-    $(".commonCell").focusin(function(){
+    jCommonCell.focusin(function () {
         g_isFocusCell = true;
         TdFocus($(this));
         TdInfo($(this));
 
-        if ($(this).children("input").val() !== "")
-        {
+        if ($(this).children("input").val() !== "") {
             oldRate = $(this).children("input").val();
         }
         else oldRate = -1;
     });
 
-    $(".commonCell").focusout(function(){
+    jCommonCell.focusout(function () {
         g_isFocusCell = false;
-        var newRate = 0;
-
-        //alert(123);
-        if ($(this).children("input").val() !== "")
-        {
-            
-            newRate = parseInt($(this).children("input").val());
-
-            if (newRate != oldRate)
-            {
-                Rating($(this), oldRate);
-            }
-        }
+        Rating($(this), oldRate);
 
         TdUnFocus();
         UnsetTdInfo($(this));
@@ -390,12 +439,15 @@ $(function() {
         return null;
     }
 
-    $(".commonCell").keydown(function(e){
+    jCommonCell.keydown(function (e) {
         var row = g_row;
         var col = g_col;
         var direction;
         switch (e.keyCode) {
+            case 27:
+                cancelFlag = true; // esc
             case 13: // enter
+            case 40: // down arrow
                 direction = Direction.Down;
                 break;
             case 38: // up arrow
@@ -404,9 +456,6 @@ $(function() {
             case 39: // right arrow
                 direction = Direction.Right;
                 break;
-            case 40: // down arrow
-                direction = Direction.Down;
-                break;
             case 37: // left arrow
                 direction = Direction.Left;
                 break;
@@ -423,40 +472,110 @@ $(function() {
             $(this).children("input").blur();
     });
 
-    $(".commonCell input").focusin(function(){
+    $(".commonCell input").focusin(function () {
         $(this).select();
     });
 
     // При нажатии на элемент commonCell дочерный input получает фокус
-    $(".commonCell ").click(function(){
+    jCommonCell.click(function () {
         $(this).children("input").focus();
-    } );
+    });
 
     // В inputCredit (где баллы вводить) разрешаем вводить только цифры
-    $(".commonCell").children("input").keydown(function(event) {
+    jCommonCell.children("input").keydown(function (event) {
         KeyDownOnlyNumber(event);
     });
 
     // Нажатие на чекбокс "Неявка"
-    $(".absenceCheck").click(function(event) {
-        controlRowVisualization($(this).parent().parent());
+    $(".absenceCheck").click(function (event) {
+        // prepare
+        var option = 'absence';
+        var checked = $(this)[0].checked;
+        if (!checked)
+            option += '_unset';
+        var thisTd = $(this).parent();
+        g_col = thisTd.attr('id').substr(8, 1); // absence_C
+        g_row = thisTd.attr('id').substr(10, 1); // absence_C_R
+
+        // call
+        TdInfo(thisTd);
+        var errCode = setExamPeriodOption($(this), option);
+        UnsetTdInfo(thisTd);
+
+        // test
+        if (errCode > 0)
+            $(this).prop('checked', !checked); // invert check;
+        controlRowVisualization(thisTd.parent());
+    });
+
+    $(".autoPassCheck").click(function (event) {
+        // prepare
+        var option = 'pass';
+        var checked = $(this)[0].checked;
+        if (!checked)
+            option += '_unset';
+        var thisTd = $(this).parent();
+        g_col = thisTd.attr('id').substr(9, 1); // autopass_C
+        g_row = thisTd.attr('id').substr(11, 1); // autopass_C_R
+
+        // call
+        TdInfo(thisTd);
+        var errCode = setExamPeriodOption($(this), option);
+        UnsetTdInfo(thisTd);
+
+        // test
+        if (errCode > 0)
+            $(this).prop('checked', !checked); // invert check;
+        controlRowVisualization(thisTd.parent());
     });
 
+
+    function setExamPeriodOption(jThis, option) {
+        jThis.attr("disabled", true);
+        var statusCode = 0;
+        $.ajax({
+            type: "POST",
+            url: URLdir + "handler/rating/SetExamPeriodOption",
+            data: "studentID=" + g_studentID + "&submoduleID=" + g_submoduleID +
+            "&option=" + optionsViewData[option].sendingOption,
+            complete: function (jqXHR, textStatus) {
+                statusCode = jqXHR.status;
+                switch (jqXHR.status) {
+                    case  403:
+                        EventInspector_ShowMsg("Сессия истекла", "error");
+                        window.location.replace(URLdir);
+                    case 200:
+                        data = $.parseJSON(jqXHR.responseText);
+                        if (data.success === true) {
+                            EventInspector_ShowMsg(optionsViewData[option].messageOK, "success");
+                            statusCode = 0;
+                        }
+                        else
+                            EventInspector_ShowMsg(optionsViewData[option].messageFail, "error");
+                        break;
+                    default:
+                        EventInspector_ShowMsg(" " + jqXHR.status, "error");
+                }
+            }
+        });
+        jThis.removeAttr("disabled");
+        return statusCode;
+    }
+
     // Фильтр по группе
-    $(".groupSelector").change(function() {
+    $(".groupSelector").change(function () {
         var group = $(this).val();
-        if (group >= 0)
-        {
+        if (group >= 0) {
             filterGroups(group);
             $.post(
                 URLdir + "handler/rating/SelectGroup",
                 {
                     "disciplineID": g_disciplineID,
-                    "groupSelected":  group
+                    "groupSelected": group
                 },
-                function(data){
+                function (data) {
                     data = $.parseJSON(data);
-                    if(data.success === true) {
+                    if (data.success === true) {
 
                     }
                 }
@@ -464,12 +583,11 @@ $(function() {
         }
     });
 
-    // Скачать таблицу оценивания в формате excel
-    $(".downloadExcel").click(function(){
+    // Скачать таблицу оценивания в формате excel // depricated
+    $(".downloadExcel").click(function () {
         $.fileDownload(URLdir + 'handler/FileCreator/GenerateExcelRatingTable', {
             httpMethod: "POST",
-            data:
-            {
+            data: {
                 'disciplineID': g_disciplineID
             },
             successCallback: function () {
@@ -482,13 +600,17 @@ $(function() {
     });
 
     // Ведомость в формате excel
-    $('body').on('click', '.downloadExcelStatement', function(){
+    $('body').on('click', '.downloadExcelStatement', function () {
+
+        var groupID = parseInt($(this).attr("id").substr(6))
+        var jStageSelector = $("#stageSelector_" + groupID);
+
         $.fileDownload(URLdir + 'handler/FileCreator/GenerateFinalForm', {
             httpMethod: "POST",
-            data:
-            {
+            data: {
                 "disciplineID": g_disciplineID,
-                "studyGroupID": parseInt($(this).attr("id").substr(6))
+                "groupID": groupID,
+                "stage": parseInt(jStageSelector.val())
             },
             successCallback: function () {
 
@@ -501,5 +623,3 @@ $(function() {
 
 
 });
-
-
diff --git a/~dev_rating/media/js/sign.js b/~dev_rating/media/js/sign.js
index de7e9acb31c6d59e86d13f64db42018dae9d6dd3..5c6fd55d06a0c7339733a9fcc803f61fb45cebe6 100644
--- a/~dev_rating/media/js/sign.js
+++ b/~dev_rating/media/js/sign.js
@@ -119,5 +119,32 @@ $(function()
             }
         }
     });
-    
+
+
+    $('.Updates .left').click(function() {
+        var block = $(this).closest('.Updates');
+        block.removeClass('visible');
+        block.next().addClass('visible');
+    });
+
+    $('.Updates .right').click(function() {
+        var block = $(this).closest('.Updates');
+        block.removeClass('visible');
+        block.prev().addClass('visible');
+    });
+
+    $('.Updates').bind('mousewheel DOMMouseScroll', function(event){
+        var block = $(this);
+        if (event.originalEvent.wheelDelta > 0 || event.originalEvent.detail < 0) {
+            if (block.next().hasClass('Updates')) {
+                block.removeClass('visible');
+                block.next().addClass('visible');  // scroll up == left
+            }
+        } else {
+            if (block.prev().hasClass('Updates')) {
+                block.removeClass('visible');
+                block.prev().addClass('visible');  // scroll down == right
+            }
+        }
+    });
 });
diff --git a/~dev_rating/modules/account/classes/Account.php b/~dev_rating/modules/account/classes/Account.php
deleted file mode 100644
index f59c365e68f0a273d1d7b0dfeac889cad197e84c..0000000000000000000000000000000000000000
--- a/~dev_rating/modules/account/classes/Account.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php
-
-class Account extends Kohana_Account { }
\ No newline at end of file
diff --git a/~dev_rating/modules/account/classes/Kohana/Account.php b/~dev_rating/modules/account/classes/Kohana/Account.php
deleted file mode 100644
index 8adc650fd91ba18751ad7e65c00ccc3b887ba2e4..0000000000000000000000000000000000000000
--- a/~dev_rating/modules/account/classes/Kohana/Account.php
+++ /dev/null
@@ -1,222 +0,0 @@
-<?php
-
-require(DOCROOT.'/modules/mail/vendor/PHPMailer/PHPMailerAutoload.php');
-
-function gradeSendMail($subject, $body, $sendToEmail, $sendToName) {
-    $mail = new PHPMailer;
-
-    //$mail->SMTPDebug = 3;                               // Enable verbose debug output
-
-    $mail->isSMTP();                                      // Set mailer to use SMTP
-    $mail->Host = 'class.mmcs.sfedu.ru';  // Specify main and backup SMTP servers
-    $mail->SMTPAuth = false;                               // Enable SMTP authentication
-    $mail->Username = NULL;                 // SMTP username
-    $mail->Password = NULL;                           // SMTP password
-    $mail->SMTPSecure = NULL;                            // Enable TLS encryption, `ssl` also accepted
-    $mail->Port = 25;                                    // TCP port to connect to
-
-    $mail->From = 'no_reply@grade.sfedu.ru';
-    $mail->FromName = 'Grade System (Сервис БРС)';
-    $mail->addAddress($sendToEmail, $sendToName);     // Add a recipient
-    //$mail->addAddress('ellen@example.com');               // Name is optional
-    //$mail->addReplyTo('info@example.com', 'Information');
-    //$mail->addCC('cc@example.com');
-    //$mail->addBCC('bcc@example.com');
-
-    //$mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
-    //$mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name
-    //$mail->isHTML(true);                                  // Set email format to HTML
-
-    $mail->Subject = $subject;
-    $mail->Body    = $body;
-    //$mail->ContentType = 'text/plain';
-    $mail->CharSet = 'utf-8';
-    //$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
-
-    if(!$mail->send()) {
-        Log::instance()->add(Log::NOTICE, 'Message could not be sent: '.$mail->ErrorInfo);
-        //echo 'Mailer Error: ' . $mail->ErrorInfo;
-    } else {
-        Log::instance()->add(Log::NOTICE, 'Message has been sent');
-    }
-}
-
-class Kohana_Account {
-    
-    protected static $_instance;
-    protected $_config;
-    protected $_model;
-
-    /**
-     * Вовзращает экземпляр класса (singleton-паттерн)
-     *
-     * @return self
-     */     
-    public static function instance() {
-        if(!isset(self::$_instance))
-        {
-            $config = Kohana::$config->load('account');
-            self::$_instance = new self($config);
-        }
-        return self::$_instance;
-    }
-    
-    private function __construct($config = array()) {
-        $this->_config = $config;
-        $this->_model = new Model_Account;
-    }
-    
-    /**
-     * Генерирует уникальный код активации для данных входных параметров.
-     *
-     * @param  string $FirstName Имя
-     * @param  string $SecondName Отчество
-     * @param  string $LastName Фамилия
-     * @return  string
-     */       
-    protected function generateActivationCode()
-    {
-        $activationCode = Text::random('ABDCEFGHJKLMNPQRSTUVWXYZ123456789', 10);
-        return UTF8::strtoupper($activationCode);
-    }
-    
-    public function createTeacher($lastName, $firstName, $secondName, $degreeID, $departamentID)
-    {
-        $activationCode = $this->generateActivationCode();
-        $response = $this->_model->createTeacher( $lastName, $firstName,
-                                                  $secondName, $degreeID,
-                                                  $departamentID, $activationCode );
-        if ($response === -1) {
-            $activationCode = -1;
-        }
-        return $activationCode;
-    }
-
-    public function createTeacherByDepName($lastName, $firstName, $secondName, $departamentName, $facultyID)
-    {
-        $activationCode = $this->generateActivationCode();
-        $response = $this->_model->createTeacherByDepName( $lastName, $firstName,
-                                                            $secondName, $departamentName, $facultyID,
-                                                            $activationCode );
-        if ($response === -1) {
-            $activationCode = -1;
-        }
-        return $activationCode;
-    }
-
-    public function createStudent($lastName, $firstName, $secondName, $grade, $groupNum, $facultyID)
-    {
-        $activationCode = $this->generateActivationCode();
-        $response = $this->_model->createStudent( $lastName, $firstName, $secondName,
-                                                  $grade, $groupNum, $facultyID,
-                                                  $activationCode );
-        if ($response === -1) {
-            $activationCode = -1;
-        }
-        return $activationCode;
-    }
-
-    public function createStudentEx($lastName, $firstName, $secondName, $studentGradeNum, $studentGroupNum, $studentDegree, $studentSpec, $facultyID)
-    {
-        $activationCode = $this->generateActivationCode();
-        $response = $this->_model->createStudentEx($lastName, $firstName, $secondName, $studentGradeNum, $studentGroupNum, $studentDegree, $studentSpec, $facultyID, $activationCode);
-        if ($response === -1) {
-            $activationCode = -1;
-        }
-        return $activationCode;
-    }
-
-    public function createSubject($name, $abbr, $facultyID)
-    {
-        return $this->_model->createSubject($name, $abbr, $facultyID);
-    }
-
-    private function checkTokenLifetime($creationDate)
-    {
-        $config = Kohana::$config->load('security.securityPolicy');
-        $lifetime = $config['recoveryToken']['lifetime'];
-        return (time() - $creationDate) > $lifetime;
-    }
-
-    public function checkToken($token)
-    {
-        $recovery = $this->_model->getRecoveryInfoByToken($token)->offsetGet(0);
-        $response = true;
-        
-        if ($recovery['isUsed']) {
-            $response = false;
-        } else {
-            $date = strtotime($recovery['Date']);
-            if($this->checkTokenLifetime($date)) {
-                $this->_model->useRecoveryToken($recovery['Token']);
-                $response = false;
-            }
-        }
-        return $response;
-    }
-
-    public function createRecoveryRequest($email)
-    {
-        $requestToken = sha1($email.time().Cookie::$salt);
-
-        $UserFullName = $this->_model->createRecoveryToken($email, $requestToken);
-        if (!$UserFullName)
-            throw HTTP_Exception::factory(403,
-                'Пользователь с таким e-mail адресом не зарегистрирован в системе!');
-
-        $subject =  ASSEMBLY_SYSTEM_NAME.": Восстановление пароля";
-
-        $twig = Twig::factory('email/recovery');
-        $twig->curl = 'https://grade.sfedu.ru/'; // URL::base('https', TRUE); TODO: fix after mmcs.sfedu.ru gets SSL-certificate
-        $twig->Token = $requestToken;
-        $twig->EMail = $email;
-        $twig->Subject = $subject;
-
-        /* Kohana mailer is not working
-        $status = Mailer::factory()
-            ->headers('Content-Type', 'text/html; charset=utf-8')
-            ->subject($subject)
-            ->in_reply_to(Mailer::message_id())
-            ->from('no-reply@rating.mmcs.sfedu.ru')
-            ->body($twig->render())
-            ->send($email);*/
-        gradeSendMail($subject, $twig->render(), $email, $UserFullName);
-    }
-
-    public function changePasswordByToken($token, $password)
-    {
-        $recovery = $this->_model->getRecoveryInfoByToken($token)->offsetGet(0);
-        $this->changePassword($recovery['AccountID'], $password);
-        $this->_model->useRecoveryToken($token);
-    }
-
-    public function isLoginExists($login)
-    {
-        $login_count = $this->_model->getAccNumByLogin($login);
-        return $login_count > 0;
-    }
-
-    public function isMailExists($email)
-    {
-        $email_count = $this->_model->getAccNumByMail($email);
-        return $email_count > 0;
-    }
-
-    public function changeLogin($id, $newLogin)
-    {
-        $response = $this->_model->changeLogin($id, $newLogin);
-        return $response != -1;
-    }
-
-    public function changeEMail($id, $newEMail)
-    {
-        $response = $this->_model->changeMail($id, $newEMail);
-        return $response != -1;
-    }
-
-    public function changePassword($id, $newPassword)
-    {
-        $response = $this->_model->changePassword($id, $newPassword);
-        return $response != -1;
-    }
-}
\ No newline at end of file
diff --git a/~dev_rating/modules/account/classes/Model/Account.php b/~dev_rating/modules/account/classes/Model/Account.php
deleted file mode 100644
index 564605891f68fe005dac6acc458663aa66291816..0000000000000000000000000000000000000000
--- a/~dev_rating/modules/account/classes/Model/Account.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php
-
-class Model_Account extends Model_Kohana_Account { }
\ No newline at end of file
diff --git a/~dev_rating/modules/account/classes/Model/Kohana/Account.php b/~dev_rating/modules/account/classes/Model/Kohana/Account.php
deleted file mode 100644
index d3af3cf27423f5452b0cee0dde18acf450be5f1f..0000000000000000000000000000000000000000
--- a/~dev_rating/modules/account/classes/Model/Kohana/Account.php
+++ /dev/null
@@ -1,251 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-
-class Model_Kohana_Account extends Model
-{
-    public function setHashKey($key)
-    {
-        $key = Database::instance()->escape($key);
-        $sql = "SELECT `SetSettings`('HashKey', '', $key) AS `Key`;";
-        $res = DB::query(Database::SELECT, $sql)->execute();
-        return $res->get('Key');
-    }
-
-    public function getHashKey()
-    {
-        $sql = "CALL `GetSettings`('HashKey');";
-        $key = DB::query(Database::SELECT, $sql)->execute();
-        return $key->get('ValS');
-    }
-
-    public function getMaintenanceInfo()
-    {
-        $sql = "CALL `GetSettings`('maintenance_active');";
-        $key = DB::query(Database::SELECT, $sql)->execute();
-        $result['active'] = ($key->get('Val') == 1);
-        $sql = "CALL `GetSettings`('maintenance_return');";
-        $key = DB::query(Database::SELECT, $sql)->execute();
-        $result['return'] = $key->get('ValS');
-        return $result;
-    }
-
-    public function checkAuth($login, $password) {
-        $db = Database::instance();
-        $login = $db->escape($login);
-        $password = $db->escape($password);
-        $sql = "SELECT `SignIn`($login, $password) AS `ID`;";
-        $res = DB::query(Database::SELECT, $sql)->execute();
-        return $res->get('ID');
-    }
-
-
-    public function ChangeTeacherInfo($id, $lastName, $firstName, $secondName, $degreeID, $departmentID)
-
-    {
-        $db = Database::instance();
-        $lastName = $db->escape($lastName);
-        $secondName = $db->escape($secondName);
-        $firstName = $db->escape($firstName);
-        $sql = "SELECT `ChangeTeacherInfo`('$id', $lastName, $firstName, $secondName, '$degreeID', '$departmentID') AS `UserID`;";
-        $key = DB::query(Database::SELECT, $sql)->execute();
-        return $key->get('UserID');
-    }
-
-
-    public function createTeacher($lastName, $firstName, $secondName, $degreeID, $departmentID, $activationCode)
-    {
-        $db = Database::instance();
-        $lastName = $db->escape($lastName);
-        $secondName = $db->escape($secondName);
-        $firstName = $db->escape($firstName);
-        $activationCode = $db->escape($activationCode);
-        $sql = "SELECT `CreateTeacher`($lastName, $firstName, $secondName, '$degreeID', '$departmentID', $activationCode) AS `UserID`;";
-        $key = DB::query(Database::SELECT, $sql)->execute();
-        return $key->get('UserID');
-    }
-
-
-    public function createTeacherByDepName($lastName, $firstName, $secondName, $departmentID, $facultyID, $activationCode)
-    {
-        $db = Database::instance();
-        $lastName = $db->escape($lastName);
-        $secondName = $db->escape($secondName);
-        $firstName = $db->escape($firstName);
-        $activationCode = $db->escape($activationCode);
-        $departmentID = $db->escape($departmentID);
-        $sql = "SELECT `CreateTeacherByDepName`($lastName, $firstName, $secondName, $departmentID, '$facultyID', $activationCode) AS `UserID`;";
-        $key = DB::query(Database::SELECT, $sql)->execute();
-        return $key->get('UserID');
-    }
-
-    public function createStudent($lastName, $firstName, $secondName, $grade, $groupNum, $facultyID, $activationCode)
-    {
-        $db = Database::instance();
-        $lastName = $db->escape($lastName);
-        $secondName = $db->escape($secondName);
-        $firstName = $db->escape($firstName);
-        $activationCode = $db->escape($activationCode);
-        $sql = "SELECT `CreateStudent`($lastName, $firstName, $secondName, '$grade', '$groupNum', '$facultyID', $activationCode) AS `UserID`;";
-        $key = DB::query(Database::SELECT, $sql)->execute();
-        return $key->get('UserID');
-    }
-
-    public function createStudentEx($lastName, $firstName, $secondName, $gradeNum, $groupNum, $degree, $specialization, $facultyID, $activationCode)
-    {
-        $db = Database::instance();
-        $lastName = $db->escape($lastName);
-        $secondName = $db->escape($secondName);
-        $firstName = $db->escape($firstName);
-        $activationCode = $db->escape($activationCode);
-        $degree = $db->escape($degree);
-        $specialization = $db->escape($specialization);
-        $sql = "SELECT `CreateStudentEx`($lastName, $firstName, $secondName, '$gradeNum', '$groupNum', $degree, $specialization, '$facultyID', $activationCode) AS `UserID`;";
-        $key = DB::query(Database::SELECT, $sql)->execute();
-        return $key->get('UserID');
-    }
-
-    public function createSubject($name, $abbr, $facultyID)
-    {
-        $db = Database::instance();
-        $name = $db->escape($name);
-        $abbr = $db->escape($abbr);
-        $sql = "SELECT `CreateSubject`('$facultyID', $name, $abbr) AS `Num`;";
-        $response = DB::query(Database::SELECT, $sql)->execute();
-        return $response->get('Num');
-    }
-
-    public function getPersonalInfo($id)
-    {
-        $sql = "CALL `GetPersonalInfo`('$id');";
-        $query = DB::query(Database::SELECT, $sql)->execute();
-        return $query[0];
-    }
-
-    public function GetAccountInfo($id)
-    {
-        $sql = "CALL GetAccountInfo('$id');";
-        $query = DB::query(Database::SELECT, $sql)->execute();
-        return $query[0];
-    }
-
-    public function changeMail($id, $mail)
-    {
-        $mail = Database::instance()->escape($mail);
-        $sql = "SELECT `ChangeMail`('$id', $mail) AS Num;";
-        $query = DB::query(Database::SELECT, $sql)->execute();
-        return $query->get('Num');
-    }
-
-    public function changeLogin($id, $login)
-    {
-        $login = Database::instance()->escape($login);
-        $sql = "SELECT `ChangeLogin`('$id', $login) AS Num;";
-        $query = DB::query(Database::SELECT, $sql)->execute();
-        return $query->get('Num');
-    }
-
-    public function changePassword($id, $password)
-    {
-        $password = Database::instance()->escape($password);
-        $sql = "SELECT `ChangePassword`('$id', $password) AS Num;";
-        $query = DB::query(Database::SELECT, $sql)->execute();
-        return $query->get('Num');
-    }
-
-    public function getAccNumByLogin($login)
-    {
-        $login = Database::instance()->escape($login);
-        $sql = "SELECT `GetAccCountByLogin`($login) AS Num;";
-        $res = DB::query(Database::SELECT, $sql)->execute();
-        return $res->get('Num');
-    }
-
-    public function getAccNumByMail($email)
-    {
-        $email = Database::instance()->escape($email);
-        $sql = "SELECT `GetAccCountByMail`($email) AS Num;";
-        $res = DB::query(Database::SELECT, $sql)->execute();
-        return $res->get('Num');
-    }
-
-    public function isActivationCodeValid($code)
-    {
-        $code = Database::instance()->escape($code);
-        $sql = "SELECT `GetAccCountByCode`($code) AS Num;";
-        $res = DB::query(Database::SELECT, $sql)->execute();
-
-        $count = $res[0]['Num'];
-        return $count == 1;
-    }
-
-    public function createRecoveryToken($email, $token)
-    {
-        $db = Database::instance();
-        $email = $db->escape($email);
-        $token = $db->escape($token);
-        $sql = "SELECT `CreateRecoveryToken`($email, $token) AS UserName;";
-        $res = DB::query(Database::SELECT, $sql)->execute();
-        return $res->get('UserName');
-    }
-
-    public function getRecoveryInfoByEMail($email)
-    {
-        $email = Database::instance()->escape($email);
-        $sql = "CALL GetRecoveryInfoByEMail($email);";
-        $query = DB::query(Database::SELECT, $sql)->execute();
-        return $query;
-    }
-
-    public function getRecoveryInfoByToken($token)
-    {
-        $token = Database::instance()->escape($token);
-        $sql = "CALL GetRecoveryInfoByToken($token);";
-        $query = DB::query(Database::SELECT, $sql)->execute();
-        return $query;
-    }
-
-    public function useRecoveryToken($token)
-    {
-        $token = Database::instance()->escape($token);
-        $sql = "SELECT `UseRecoveryToken`($token) AS Num;";
-        $email = DB::query(Database::SELECT, $sql)->execute();
-        return $email->get('Num');
-    }
-
-    public function activateAccount($login, $password, $email, $code)
-    {
-        $db = Database::instance();
-        $login = $db->escape($login);
-        $password = $db->escape($password);
-        $email = $db->escape($email);
-        $code = $db->escape($code);
-        $sql = "SELECT `ActivateAccount` ($code, $login, $email, $password) AS `Num`; ";
-        $res = DB::query(Database::SELECT, $sql)->execute();
-        foreach ($res as $value) {
-            $id = $value['Num'];
-        }
-        return $id;
-    }
-
-    public function GetCurSemesterID()
-    {
-        $sql = "CALL `GetSettings`('SemesterID');";
-        $res = DB::query(Database::SELECT, $sql)->execute();
-        $id = NULL;
-        foreach ($res as $value) {
-            $id = $value['Val'];
-        }
-        return $id;
-    }
-
-    public function SetSemesterID($semesterID)
-    {
-        $sql = "SELECT `SetSemesterID`('$semesterID') AS `Num`; ";
-        $res = DB::query(Database::SELECT, $sql)->execute();
-
-        $id = 0;
-        foreach ($res as $value) {
-            $id = $value['Num'];
-        }
-        return $id;
-    }
-}
\ No newline at end of file
diff --git a/~dev_rating/modules/account/classes/User.php b/~dev_rating/modules/account/classes/User.php
deleted file mode 100644
index 62449146b19515437fe5d3384b56a3b2ea28e7d9..0000000000000000000000000000000000000000
--- a/~dev_rating/modules/account/classes/User.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php
-
-class User extends Kohana_User { }
\ No newline at end of file
diff --git a/~dev_rating/modules/database/classes/Kohana/Config/Database/Reader.php b/~dev_rating/modules/database/classes/Kohana/Config/Database/Reader.php
index 73e0dfd02a85046dfd7a973d9302a1ef6ccc30ad..a05645587ad183af8d0f424693f7c1b21e1ca6ef 100644
--- a/~dev_rating/modules/database/classes/Kohana/Config/Database/Reader.php
+++ b/~dev_rating/modules/database/classes/Kohana/Config/Database/Reader.php
@@ -18,7 +18,7 @@ class Kohana_Config_Database_Reader implements Kohana_Config_Reader
 	/**
 	 * Constructs the database reader object
 	 *
-	 * @param array Configuration for the reader
+	 * @param $config array Configuration for the reader
 	 */
 	public function __construct(array $config = NULL)
 	{
diff --git a/~dev_rating/modules/database/classes/Kohana/Database/Query.php b/~dev_rating/modules/database/classes/Kohana/Database/Query.php
index cd8f39b0f860df40cdcea3521ff1bb59e38432ea..d0ef3a9f15a416e7c64b3545f4962526571fb7f0 100644
--- a/~dev_rating/modules/database/classes/Kohana/Database/Query.php
+++ b/~dev_rating/modules/database/classes/Kohana/Database/Query.php
@@ -23,13 +23,13 @@ class Kohana_Database_Query {
 	protected $_sql;
 
 	// Quoted query parameters
-	protected $_parameters = array();
+	protected $_parameters = [];
 
 	// Return results as associative arrays or objects
 	protected $_as_object = FALSE;
 
 	// Parameters for __construct when using object results
-	protected $_object_params = array();
+	protected $_object_params = [];
 
 	/**
 	 * Creates a new SQL query of the specified type.
@@ -76,7 +76,7 @@ class Kohana_Database_Query {
 	 * Enables the query to be cached for a specified amount of time.
 	 *
 	 * @param   integer  $lifetime  number of seconds to cache, 0 deletes it from the cache
-	 * @param   boolean  whether or not to execute the query during a cache hit
+	 * @param   boolean  $force whether or not to execute the query during a cache hit
 	 * @return  $this
 	 * @uses    Kohana::$cache_life
 	 */
@@ -103,7 +103,7 @@ class Kohana_Database_Query {
 	{
 		$this->_as_object = FALSE;
 
-		$this->_object_params = array();
+		$this->_object_params = [];
 
 		return $this;
 	}
@@ -111,8 +111,8 @@ class Kohana_Database_Query {
 	/**
 	 * Returns results as objects
 	 *
-	 * @param   string  $class  classname or TRUE for stdClass
-	 * @param   array   $params
+	 * @param   string|boolean  $class  classname or TRUE for stdClass
+	 * @param   array   $params object constructor arguments
 	 * @return  $this
 	 */
 	public function as_object($class = TRUE, array $params = NULL)
@@ -193,7 +193,7 @@ class Kohana_Database_Query {
 		if ( ! empty($this->_parameters))
 		{
 			// Quote all of the values
-			$values = array_map(array($db, 'quote'), $this->_parameters);
+			$values = array_map([$db, 'quote'], $this->_parameters);
 
 			// Replace the values in the SQL
 			$sql = strtr($sql, $values);
@@ -206,14 +206,16 @@ class Kohana_Database_Query {
 	 * Execute the current query on the given database.
 	 *
 	 * @param   mixed    $db  Database instance or name of instance
-	 * @param   string   result object classname, TRUE for stdClass or FALSE for array
-	 * @param   array    result object constructor arguments
+	 * @param   string   $as_object result object classname, TRUE for stdClass or FALSE for array
+	 * @param   array    $object_params result object constructor arguments
 	 * @return  Database_RESULT   Database_Result for SELECT queries
 	 * @return  mixed    the insert id for INSERT queries
 	 * @return  integer  number of affected rows for all other queries
 	 */
 	public function execute($db = NULL, $as_object = NULL, $object_params = NULL)
 	{
+        $time = microtime(true);
+
 		if ( ! is_object($db))
 		{
 			// Get the database instance
@@ -256,7 +258,15 @@ class Kohana_Database_Query {
 			Kohana::cache($cache_key, $result->as_array(), $this->_lifetime);
 		}
 
-		return $result;
+        // logging
+        $logging = Model_System::loadConfig('general.json')->Logging;
+        if ($logging) {
+            $time = microtime(true) - $time;
+            $message = sprintf("%7.4f |  DB: %-75s", $time, $this->_sql);
+            if ($logging) Log::instance()->add(Log::INFO, $message);
+        }
+
+        return $result;
 	}
 
 } // End Database_Query
diff --git a/~dev_rating/modules/database/classes/Kohana/Model/Database.php b/~dev_rating/modules/database/classes/Kohana/Model/Database.php
index 790e8f04afa8ee225ef5683b647eb372cb094d78..58e27ffd02c48f72f0ccbb1b570c9532eaa86258 100644
--- a/~dev_rating/modules/database/classes/Kohana/Model/Database.php
+++ b/~dev_rating/modules/database/classes/Kohana/Model/Database.php
@@ -38,7 +38,6 @@ abstract class Kohana_Model_Database extends Model {
 	 *     $model = new Foo_Model($db);
 	 *
 	 * @param   mixed  $db  Database instance object or string
-	 * @return  void
 	 */
 	public function __construct($db = NULL)
 	{
diff --git a/~dev_rating/modules/kotwig/classes/Kohana/Twig.php b/~dev_rating/modules/kotwig/classes/Kohana/Twig.php
index f6b31997586387c86dc7dbc87b634d82a4376d79..aeec0df204438964f39d5d0603b72c046357ffe6 100644
--- a/~dev_rating/modules/kotwig/classes/Kohana/Twig.php
+++ b/~dev_rating/modules/kotwig/classes/Kohana/Twig.php
@@ -50,7 +50,7 @@ class Kohana_Twig extends View {
 	 */
 	public static function factory($file = NULL, array $data = NULL)
 	{
-		return new Twig($file, $data);
+		return new Kotwig($file, $data);
 	}
 
 	/**
diff --git a/~dev_rating/modules/kotwig/classes/Twig.php b/~dev_rating/modules/kotwig/classes/Kotwig.php
similarity index 63%
rename from ~dev_rating/modules/kotwig/classes/Twig.php
rename to ~dev_rating/modules/kotwig/classes/Kotwig.php
index 9bb9479dc55dc6b06b8f7fc59d60e73b4785aa20..6a692a45aa7db51cb9612d769b250223db57e9f9 100644
--- a/~dev_rating/modules/kotwig/classes/Twig.php
+++ b/~dev_rating/modules/kotwig/classes/Kotwig.php
@@ -1,3 +1,3 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
-class Twig extends Kohana_Twig {}
+class Kotwig extends Kohana_Twig {}
diff --git a/~dev_rating/modules/kotwig/init.php b/~dev_rating/modules/kotwig/init.php
index 5c04d5acd3daa59b2a3b29ad90ae62c2efa72937..a9f6687cb312951c6a02aa894bd51be7248c07b4 100644
--- a/~dev_rating/modules/kotwig/init.php
+++ b/~dev_rating/modules/kotwig/init.php
@@ -1,4 +1,4 @@
 <?php defined('SYSPATH') or die('No direct script access.');
 
 define('TWIGPATH', rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR);
-Twig::init();
+Kotwig::init();
diff --git a/~dev_rating/modules/mpdf/classes/View/MPDF/Core.php b/~dev_rating/modules/mpdf/classes/View/MPDF/Core.php
index 55efcb3ae774d66292913df02d603ff0954af3bb..0dbff06446408154b8920e964c70055dea68f632 100644
--- a/~dev_rating/modules/mpdf/classes/View/MPDF/Core.php
+++ b/~dev_rating/modules/mpdf/classes/View/MPDF/Core.php
@@ -9,7 +9,7 @@
  * @copyright  (c) 2009 Woody Gilk
  * @license    MIT
  */
-abstract class View_MPDF_Core extends Twig {
+abstract class View_MPDF_Core extends Kotwig {
 
 	protected $mpdf = NULL;
 	protected $view_file = NULL;
diff --git a/~dev_rating/modules/unittest/bootstrap.php b/~dev_rating/modules/unittest/bootstrap.php
index 177dae15a0a76e7c57d7eef1bf91461c67d39334..493076b62b3d66ff34c2f968def713aa08d33142 100644
--- a/~dev_rating/modules/unittest/bootstrap.php
+++ b/~dev_rating/modules/unittest/bootstrap.php
@@ -121,5 +121,10 @@ if (($ob_len = ob_get_length()) !== FALSE)
 	}
 }
 
-// Enable the unittest module
-Kohana::modules(Kohana::modules() + array('unittest' => MODPATH.'unittest'));
\ No newline at end of file
+// Enable the unittest module if it is not already loaded - use the absolute path
+$modules = Kohana::modules();
+$unittest_path = realpath(__DIR__).DIRECTORY_SEPARATOR;
+if ( ! in_array($unittest_path, $modules)) {
+    $modules['unittest'] = $unittest_path;
+    Kohana::modules($modules);
+}
diff --git a/~dev_rating/system/classes/HTTP/Exception.php b/~dev_rating/system/classes/HTTP/Exception.php
deleted file mode 100644
index 814e3b66186c716e15ec50381ae068d8c2b73fc1..0000000000000000000000000000000000000000
--- a/~dev_rating/system/classes/HTTP/Exception.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php defined('SYSPATH') OR die('No direct script access.');
-
-class HTTP_Exception extends Kohana_HTTP_Exception {}
diff --git a/~dev_rating/system/classes/Kohana/Controller.php b/~dev_rating/system/classes/Kohana/Controller.php
index c7433607942057e838e4158d32e473146b22a72d..9747cc18678f3704406e56cd2387aa32e2f92c1e 100644
--- a/~dev_rating/system/classes/Kohana/Controller.php
+++ b/~dev_rating/system/classes/Kohana/Controller.php
@@ -32,14 +32,13 @@ abstract class Kohana_Controller {
 	 */
 	public $response;
 
-	/**
-	 * Creates a new controller instance. Each controller must be constructed
-	 * with the request object that created it.
-	 *
-	 * @param   Request   $request  Request that created the controller
-	 * @param   Response  $response The request's response
-	 * @return  void
-	 */
+    /**
+     * Creates a new controller instance. Each controller must be constructed
+     * with the request object that created it.
+     *
+     * @param   Request  $request  Request that created the controller
+     * @param   Response $response The request's response
+     */
 	public function __construct(Request $request, Response $response)
 	{
 		// Assign the request to the controller
@@ -49,25 +48,21 @@ abstract class Kohana_Controller {
 		$this->response = $response;
 	}
 
-	/**
-	 * Executes the given action and calls the [Controller::before] and [Controller::after] methods.
-	 *
-	 * Can also be used to catch exceptions from actions in a single place.
-	 *
-	 * 1. Before the controller action is called, the [Controller::before] method
-	 * will be called.
-	 * 2. Next the controller action will be called.
-	 * 3. After the controller action is called, the [Controller::after] method
-	 * will be called.
-	 *
-	 * @throws  HTTP_Exception_404
-	 * @return  Response
-	 */
+    /**
+     * Executes the given action and calls the [Controller::before] and [Controller::after] methods.
+     *
+     * Can also be used to catch exceptions from actions in a single place.
+     *
+     * 1. Before the controller action is called, the [Controller::before] method
+     * will be called.
+     * 2. Next the controller action will be called.
+     * 3. After the controller action is called, the [Controller::after] method
+     * will be called.
+     * @return Response
+     * @throws HTTP_Exception
+     */
 	public function execute()
 	{
-		// Execute the "before action" method
-		$this->before();
-
 		// Determine the action to use
 		$action = 'action_'.$this->request->action();
 
@@ -76,15 +71,33 @@ abstract class Kohana_Controller {
 		{
 			throw HTTP_Exception::factory(404,
 				'The requested URL :uri was not found on this server.',
-				array(':uri' => $this->request->uri())
+				[':uri' => $this->request->uri()]
 			)->request($this->request);
 		}
 
-		// Execute the action itself
-		$this->{$action}();
+        try {
+            $time = microtime(true);
+
+            // Execute the "before action" method
+            $this->before();
+
+            // Execute the action itself
+            $this->{$action}();
+
+            // Execute the "after action" method
+            $this->after();
 
-		// Execute the "after action" method
-		$this->after();
+            $logging = Model_System::loadConfig('general.json')->Logging;
+            if ($logging) {
+                $time = microtime(true) - $time;
+                $place = get_class($this) . '::' . $action . '()';
+                $message = sprintf("%7.4f |      %-75s", $time, $place);
+                Log::instance()->add(Log::INFO, $message);
+            }
+        } catch (LogicException $e) {
+            throw HTTP_Exception::factory(404, $e->getMessage())
+                ->request($this->request);
+        }
 
 		// Return the response
 		return $this->response;
@@ -124,7 +137,7 @@ abstract class Kohana_Controller {
 	 */
 	public static function redirect($uri = '', $code = 302)
 	{
-		return HTTP::redirect( (string) $uri, $code);
+		HTTP::redirect( (string) $uri, $code);
 	}
 
 	/**
diff --git a/~dev_rating/system/classes/Kohana/HTTP.php b/~dev_rating/system/classes/Kohana/HTTP.php
index eca52c4e6a7c88b586ed989e8a6931de16d7440d..4ccb2179fa33bc0c6adfa51f0f29bdc8be0a027c 100644
--- a/~dev_rating/system/classes/Kohana/HTTP.php
+++ b/~dev_rating/system/classes/Kohana/HTTP.php
@@ -21,21 +21,21 @@ abstract class Kohana_HTTP {
 	 */
 	public static $protocol = 'HTTP/1.1';
 
-	/**
-	 * Issues a HTTP redirect.
-	 *
-	 * @param  string    $uri       URI to redirect to
-	 * @param  int       $code      HTTP Status code to use for the redirect
-	 * @throws HTTP_Exception
-	 */
+    /**
+     * Issues a HTTP redirect.
+     *
+     * @param  string $uri  URI to redirect to
+     * @param  int    $code HTTP Status code to use for the redirect
+     * @throws Kohana_Exception
+     */
 	public static function redirect($uri = '', $code = 302)
 	{
 		$e = HTTP_Exception::factory($code);
 
 		if ( ! $e instanceof HTTP_Exception_Redirect)
-			throw new Kohana_Exception('Invalid redirect code \':code\'', array(
+			throw new Kohana_Exception('Invalid redirect code \':code\'', [
 				':code' => $code
-			));
+			]);
 
 		throw $e->location($uri);
 	}
@@ -99,7 +99,7 @@ abstract class Kohana_HTTP {
 		}
 
 		// Otherwise we use the slower PHP parsing
-		$headers = array();
+		$headers = [];
 
 		// Match all HTTP headers
 		if (preg_match_all('/(\w[^\s:]*):[ ]*([^\r\n]*(?:\r\n[ \t][^\r\n]*)*)/', $header_string, $matches))
@@ -125,10 +125,10 @@ abstract class Kohana_HTTP {
 					// Otherwise create a new array with the entries
 					else
 					{
-						$headers[$matches[1][$key]] = array(
+						$headers[$matches[1][$key]] = [
 							$headers[$matches[1][$key]],
 							$matches[2][$key],
-						);
+						];
 					}
 				}
 			}
@@ -164,7 +164,7 @@ abstract class Kohana_HTTP {
 		}
 
 		// Setup the output
-		$headers = array();
+		$headers = [];
 
 		// Parse the content type
 		if ( ! empty($_SERVER['CONTENT_TYPE']))
@@ -187,7 +187,7 @@ abstract class Kohana_HTTP {
 			}
 
 			// This is a dirty hack to ensure HTTP_X_FOO_BAR becomes x-foo-bar
-			$headers[str_replace(array('HTTP_', '_'), array('', '-'), $key)] = $value;
+			$headers[str_replace(['HTTP_', '_'], ['', '-'], $key)] = $value;
 		}
 
 		return new HTTP_Header($headers);
@@ -200,12 +200,12 @@ abstract class Kohana_HTTP {
 	 * @param   array   $params  Params
 	 * @return  string
 	 */
-	public static function www_form_urlencode(array $params = array())
+	public static function www_form_urlencode(array $params = [])
 	{
 		if ( ! $params)
 			return;
 
-		$encoded = array();
+		$encoded = [];
 
 		foreach ($params as $key => $value)
 		{
diff --git a/~dev_rating/system/classes/Kohana/Model.php b/~dev_rating/system/classes/Kohana/Model.php
index 34d3a802b23ead1a553b1d384f37954604cc7eb0..243b8a81d843f6940fd404353c2bfc97120fc7dd 100644
--- a/~dev_rating/system/classes/Kohana/Model.php
+++ b/~dev_rating/system/classes/Kohana/Model.php
@@ -10,21 +10,4 @@
  */
 abstract class Kohana_Model {
 
-	/**
-	 * Create a new model instance.
-	 *
-	 *     $model = Model::factory($name);
-	 *
-	 * @param   string  $name   model name
-	 * @return  Model
-	 * @deprecated don't use it in the project!
-	 */
-	public static function factory($name)
-	{
-		// Add the model prefix
-		$class = 'Model_'.$name;
-
-		return new $class;
-	}
-
 }
diff --git a/~dev_rating/system/classes/Kohana/Request/Client/Internal.php b/~dev_rating/system/classes/Kohana/Request/Client/Internal.php
index 88340489ed673cfbc3ea974e184125ef7a1eb336..7d0b81d014c1797492a025f5fd5d7315eafae57f 100644
--- a/~dev_rating/system/classes/Kohana/Request/Client/Internal.php
+++ b/~dev_rating/system/classes/Kohana/Request/Client/Internal.php
@@ -42,7 +42,7 @@ class Kohana_Request_Client_Internal extends Request_Client {
 		if ($directory)
 		{
 			// Add the directory name to the class prefix
-			$prefix .= str_replace(array('\\', '/'), '_', trim($directory, '/')).'_';
+			$prefix .= str_replace(['\\', '/'], '_', trim($directory, '/')).'_';
 		}
 
 		if (Kohana::$profiling)
@@ -60,6 +60,8 @@ class Kohana_Request_Client_Internal extends Request_Client {
 			$benchmark = Profiler::start('Requests', $benchmark);
 		}
 
+        $time = microtime(true);
+
 		// Store the currently active request
 		$previous = Request::$current;
 
@@ -73,9 +75,11 @@ class Kohana_Request_Client_Internal extends Request_Client {
 		{
 			if ( ! class_exists($prefix.$controller))
 			{
+                Log::instance()->add(Log::ERROR, "Class $prefix$controller does not exist!");
+
 				throw HTTP_Exception::factory(404,
 					'The requested URL :uri was not found on this server.',
-					array(':uri' => $request->uri())
+					[':uri' => $request->uri()]
 				)->request($request);
 			}
 
@@ -86,7 +90,7 @@ class Kohana_Request_Client_Internal extends Request_Client {
 			{
 				throw new Kohana_Exception(
 					'Cannot create instances of abstract :controller',
-					array(':controller' => $prefix.$controller)
+					[':controller' => $prefix.$controller]
 				);
 			}
 
@@ -122,7 +126,15 @@ class Kohana_Request_Client_Internal extends Request_Client {
 		// Restore the previous request
 		Request::$current = $previous;
 
-		if (isset($benchmark))
+        $logging = Model_System::loadConfig('general.json')->Logging;
+
+        if ($request == Request::$initial && $logging) {
+            $time = microtime(true) - $time;
+            $message = sprintf("%7.4f | URI: %-75s", $time, $request->uri());
+            Log::instance()->add(Log::INFO, $message);
+        }
+
+        if (isset($benchmark))
 		{
 			// Stop the benchmark
 			Profiler::stop($benchmark);
diff --git a/~dev_rating/system/classes/Kohana/Session.php b/~dev_rating/system/classes/Kohana/Session.php
index b15bf4324e75560cedb987867b54d02c924de461..fee393e55359a8168770bc3985b8f9fcc3e6df51 100644
--- a/~dev_rating/system/classes/Kohana/Session.php
+++ b/~dev_rating/system/classes/Kohana/Session.php
@@ -8,7 +8,7 @@
  * @copyright  (c) 2008-2012 Kohana Team
  * @license    http://kohanaframework.org/license
  */
-abstract class Kohana_Session {
+abstract class Kohana_Session implements ArrayAccess {
 
 	/**
 	 * @var  string  default session adapter
@@ -92,7 +92,6 @@ abstract class Kohana_Session {
 	 *
 	 * @param   array   $config configuration
 	 * @param   string  $id     session id
-	 * @return  void
 	 * @uses    Session::read
 	 */
 	public function __construct(array $config = NULL, $id = NULL)
@@ -247,6 +246,24 @@ abstract class Kohana_Session {
 		return $this;
 	}
 
+    public function offsetExists($offset) {
+        return array_key_exists($offset, $this->_data);
+    }
+
+    public function offsetGet($offset) {
+        if (!array_key_exists($offset, $this->_data))
+            throw new ErrorException('No such field');
+        return $this->_data[$offset];
+    }
+
+    public function offsetSet($offset, $value) {
+        $this->_data[$offset] = $value;
+    }
+
+    public function offsetUnset($offset) {
+        unset($this->_data[$offset]);
+    }
+
 	/**
 	 * Set a variable by reference.
 	 *
@@ -283,14 +300,14 @@ abstract class Kohana_Session {
 		return $this;
 	}
 
-	/**
-	 * Loads existing session data.
-	 *
-	 *     $session->read();
-	 *
-	 * @param   string  $id session id
-	 * @return  void
-	 */
+    /**
+     * Loads existing session data.
+     *
+     *     $session->read();
+     *
+     * @param   string $id session id
+     * @throws Session_Exception
+     */
 	public function read($id = NULL)
 	{
 		$data = NULL;
diff --git a/~dev_rating/system/classes/Kohana/Text.php b/~dev_rating/system/classes/Kohana/Text.php
index 7514fd66cb58f1a1a5405f63d9cc74e413b754d5..4b6e52904e12d43c6f3e248ed8b4894260b3de51 100644
--- a/~dev_rating/system/classes/Kohana/Text.php
+++ b/~dev_rating/system/classes/Kohana/Text.php
@@ -10,6 +10,20 @@
  */
 class Kohana_Text {
 
+    public static function dump($data) { var_dump($data); }
+
+    // take array with (at least) LastName & FirstName keys
+    public static function abbreviateName($personInfo) {
+        if (is_string($personInfo))
+            return $personInfo;
+
+        $fullName = $personInfo['LastName'] . ' ' . UTF8::substr($personInfo['FirstName'], 0, 1) . '. ';
+        if (!empty($personInfo['SecondName'])) {
+            $fullName .= UTF8::substr($personInfo['SecondName'], 0, 1) . '.';
+        }
+        return $fullName;
+    }
+
 	/**
 	 * @var  array   number units and text equivalents
 	 */
diff --git a/~dev_rating/system/classes/Kohana/UTF8.php b/~dev_rating/system/classes/Kohana/UTF8.php
index ca5e315a8de9b84860e9b59e081c2efd2c83893b..8f18610f01be9dc2310076606c610ee8f017d22b 100644
--- a/~dev_rating/system/classes/Kohana/UTF8.php
+++ b/~dev_rating/system/classes/Kohana/UTF8.php
@@ -33,6 +33,17 @@ class Kohana_UTF8 {
 	 */
 	public static $called = array();
 
+    public static function clear(&$str) {
+        if (is_array($str)) {
+            foreach ($str as &$value) {
+                $value = self::clear($value);
+            }
+            return $str;
+        }
+
+        return trim(preg_replace('/[^\P{C}\n]+/u', '', $str));
+    }
+
 	/**
 	 * Recursively cleans arrays, objects, and strings. Removes ASCII control
 	 * codes and converts to the requested charset while silently discarding
diff --git a/~dev_rating/system/classes/Kohana/View.php b/~dev_rating/system/classes/Kohana/View.php
index 662a9327a3f52474b74be129ba837592fa5a90ed..9292980552e6c493f00275a1e73ae49b4efad6af 100644
--- a/~dev_rating/system/classes/Kohana/View.php
+++ b/~dev_rating/system/classes/Kohana/View.php
@@ -30,17 +30,18 @@ class Kohana_View {
 		return new View($file, $data);
 	}
 
-	/**
-	 * Captures the output that is generated when a view is included.
-	 * The view data will be extracted to make local variables. This method
-	 * is static to prevent object scope resolution.
-	 *
-	 *     $output = View::capture($file, $data);
-	 *
-	 * @param   string  $kohana_view_filename   filename
-	 * @param   array   $kohana_view_data       variables
-	 * @return  string
-	 */
+    /**
+     * Captures the output that is generated when a view is included.
+     * The view data will be extracted to make local variables. This method
+     * is static to prevent object scope resolution.
+     *
+     *     $output = View::capture($file, $data);
+     *
+     * @param   string $kohana_view_filename filename
+     * @param   array $kohana_view_data variables
+     * @return string
+     * @throws Exception
+     */
 	protected static function capture($kohana_view_filename, array $kohana_view_data)
 	{
 		// Import the view variables to local namespace
@@ -127,7 +128,6 @@ class Kohana_View {
 	 *
 	 * @param   string  $file   view filename
 	 * @param   array   $data   array of values
-	 * @return  void
 	 * @uses    View::set_filename
 	 */
 	public function __construct($file = NULL, array $data = NULL)
diff --git a/~dev_rating/system/classes/Parsedown.php b/~dev_rating/system/classes/Parsedown.php
new file mode 100644
index 0000000000000000000000000000000000000000..0b877aa8f35a54b190b11d93233ee680edddb35c
--- /dev/null
+++ b/~dev_rating/system/classes/Parsedown.php
@@ -0,0 +1,1528 @@
+<?php
+
+#
+#
+# Parsedown
+# http://parsedown.org
+#
+# (c) Emanuil Rusev
+# http://erusev.com
+#
+# For the full license information, view the LICENSE file that was distributed
+# with this source code.
+#
+#
+
+class Parsedown
+{
+    # ~
+
+    const version = '1.5.3';
+
+    # ~
+
+    function text($text)
+    {
+        # make sure no definitions are set
+        $this->DefinitionData = array();
+
+        # standardize line breaks
+        $text = str_replace(array("\r\n", "\r"), "\n", $text);
+
+        # remove surrounding line breaks
+        $text = trim($text, "\n");
+
+        # split text into lines
+        $lines = explode("\n", $text);
+
+        # iterate through lines to identify blocks
+        $markup = $this->lines($lines);
+
+        # trim line breaks
+        $markup = trim($markup, "\n");
+
+        return $markup;
+    }
+
+    #
+    # Setters
+    #
+
+    function setBreaksEnabled($breaksEnabled)
+    {
+        $this->breaksEnabled = $breaksEnabled;
+
+        return $this;
+    }
+
+    protected $breaksEnabled;
+
+    function setMarkupEscaped($markupEscaped)
+    {
+        $this->markupEscaped = $markupEscaped;
+
+        return $this;
+    }
+
+    protected $markupEscaped;
+
+    function setUrlsLinked($urlsLinked)
+    {
+        $this->urlsLinked = $urlsLinked;
+
+        return $this;
+    }
+
+    protected $urlsLinked = true;
+
+    #
+    # Lines
+    #
+
+    protected $BlockTypes = array(
+        '#' => array('Header'),
+        '*' => array('Rule', 'List'),
+        '+' => array('List'),
+        '-' => array('SetextHeader', 'Table', 'Rule', 'List'),
+        '0' => array('List'),
+        '1' => array('List'),
+        '2' => array('List'),
+        '3' => array('List'),
+        '4' => array('List'),
+        '5' => array('List'),
+        '6' => array('List'),
+        '7' => array('List'),
+        '8' => array('List'),
+        '9' => array('List'),
+        ':' => array('Table'),
+        '<' => array('Comment', 'Markup'),
+        '=' => array('SetextHeader'),
+        '>' => array('Quote'),
+        '[' => array('Reference'),
+        '_' => array('Rule'),
+        '`' => array('FencedCode'),
+        '|' => array('Table'),
+        '~' => array('FencedCode'),
+    );
+
+    # ~
+
+    protected $DefinitionTypes = array(
+        '[' => array('Reference'),
+    );
+
+    # ~
+
+    protected $unmarkedBlockTypes = array(
+        'Code',
+    );
+
+    #
+    # Blocks
+    #
+
+    private function lines(array $lines)
+    {
+        $CurrentBlock = null;
+
+        foreach ($lines as $line)
+        {
+            if (chop($line) === '')
+            {
+                if (isset($CurrentBlock))
+                {
+                    $CurrentBlock['interrupted'] = true;
+                }
+
+                continue;
+            }
+
+            if (strpos($line, "\t") !== false)
+            {
+                $parts = explode("\t", $line);
+
+                $line = $parts[0];
+
+                unset($parts[0]);
+
+                foreach ($parts as $part)
+                {
+                    $shortage = 4 - mb_strlen($line, 'utf-8') % 4;
+
+                    $line .= str_repeat(' ', $shortage);
+                    $line .= $part;
+                }
+            }
+
+            $indent = 0;
+
+            while (isset($line[$indent]) and $line[$indent] === ' ')
+            {
+                $indent ++;
+            }
+
+            $text = $indent > 0 ? substr($line, $indent) : $line;
+
+            # ~
+
+            $Line = array('body' => $line, 'indent' => $indent, 'text' => $text);
+
+            # ~
+
+            if (isset($CurrentBlock['incomplete']))
+            {
+                $Block = $this->{'block'.$CurrentBlock['type'].'Continue'}($Line, $CurrentBlock);
+
+                if (isset($Block))
+                {
+                    $CurrentBlock = $Block;
+
+                    continue;
+                }
+                else
+                {
+                    if (method_exists($this, 'block'.$CurrentBlock['type'].'Complete'))
+                    {
+                        $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock);
+                    }
+
+                    unset($CurrentBlock['incomplete']);
+                }
+            }
+
+            # ~
+
+            $marker = $text[0];
+
+            # ~
+
+            $blockTypes = $this->unmarkedBlockTypes;
+
+            if (isset($this->BlockTypes[$marker]))
+            {
+                foreach ($this->BlockTypes[$marker] as $blockType)
+                {
+                    $blockTypes []= $blockType;
+                }
+            }
+
+            #
+            # ~
+
+            foreach ($blockTypes as $blockType)
+            {
+                $Block = $this->{'block'.$blockType}($Line, $CurrentBlock);
+
+                if (isset($Block))
+                {
+                    $Block['type'] = $blockType;
+
+                    if ( ! isset($Block['identified']))
+                    {
+                        $Blocks []= $CurrentBlock;
+
+                        $Block['identified'] = true;
+                    }
+
+                    if (method_exists($this, 'block'.$blockType.'Continue'))
+                    {
+                        $Block['incomplete'] = true;
+                    }
+
+                    $CurrentBlock = $Block;
+
+                    continue 2;
+                }
+            }
+
+            # ~
+
+            if (isset($CurrentBlock) and ! isset($CurrentBlock['type']) and ! isset($CurrentBlock['interrupted']))
+            {
+                $CurrentBlock['element']['text'] .= "\n".$text;
+            }
+            else
+            {
+                $Blocks []= $CurrentBlock;
+
+                $CurrentBlock = $this->paragraph($Line);
+
+                $CurrentBlock['identified'] = true;
+            }
+        }
+
+        # ~
+
+        if (isset($CurrentBlock['incomplete']) and method_exists($this, 'block'.$CurrentBlock['type'].'Complete'))
+        {
+            $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock);
+        }
+
+        # ~
+
+        $Blocks []= $CurrentBlock;
+
+        unset($Blocks[0]);
+
+        # ~
+
+        $markup = '';
+
+        foreach ($Blocks as $Block)
+        {
+            if (isset($Block['hidden']))
+            {
+                continue;
+            }
+
+            $markup .= "\n";
+            $markup .= isset($Block['markup']) ? $Block['markup'] : $this->element($Block['element']);
+        }
+
+        $markup .= "\n";
+
+        # ~
+
+        return $markup;
+    }
+
+    #
+    # Code
+
+    protected function blockCode($Line, $Block = null)
+    {
+        if (isset($Block) and ! isset($Block['type']) and ! isset($Block['interrupted']))
+        {
+            return;
+        }
+
+        if ($Line['indent'] >= 4)
+        {
+            $text = substr($Line['body'], 4);
+
+            $Block = array(
+                'element' => array(
+                    'name' => 'pre',
+                    'handler' => 'element',
+                    'text' => array(
+                        'name' => 'code',
+                        'text' => $text,
+                    ),
+                ),
+            );
+
+            return $Block;
+        }
+    }
+
+    protected function blockCodeContinue($Line, $Block)
+    {
+        if ($Line['indent'] >= 4)
+        {
+            if (isset($Block['interrupted']))
+            {
+                $Block['element']['text']['text'] .= "\n";
+
+                unset($Block['interrupted']);
+            }
+
+            $Block['element']['text']['text'] .= "\n";
+
+            $text = substr($Line['body'], 4);
+
+            $Block['element']['text']['text'] .= $text;
+
+            return $Block;
+        }
+    }
+
+    protected function blockCodeComplete($Block)
+    {
+        $text = $Block['element']['text']['text'];
+
+        $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8');
+
+        $Block['element']['text']['text'] = $text;
+
+        return $Block;
+    }
+
+    #
+    # Comment
+
+    protected function blockComment($Line)
+    {
+        if ($this->markupEscaped)
+        {
+            return;
+        }
+
+        if (isset($Line['text'][3]) and $Line['text'][3] === '-' and $Line['text'][2] === '-' and $Line['text'][1] === '!')
+        {
+            $Block = array(
+                'markup' => $Line['body'],
+            );
+
+            if (preg_match('/-->$/', $Line['text']))
+            {
+                $Block['closed'] = true;
+            }
+
+            return $Block;
+        }
+    }
+
+    protected function blockCommentContinue($Line, array $Block)
+    {
+        if (isset($Block['closed']))
+        {
+            return;
+        }
+
+        $Block['markup'] .= "\n" . $Line['body'];
+
+        if (preg_match('/-->$/', $Line['text']))
+        {
+            $Block['closed'] = true;
+        }
+
+        return $Block;
+    }
+
+    #
+    # Fenced Code
+
+    protected function blockFencedCode($Line)
+    {
+        if (preg_match('/^(['.$Line['text'][0].']{3,})[ ]*([\w-]+)?[ ]*$/', $Line['text'], $matches))
+        {
+            $Element = array(
+                'name' => 'code',
+                'text' => '',
+            );
+
+            if (isset($matches[2]))
+            {
+                $class = 'language-'.$matches[2];
+
+                $Element['attributes'] = array(
+                    'class' => $class,
+                );
+            }
+
+            $Block = array(
+                'char' => $Line['text'][0],
+                'element' => array(
+                    'name' => 'pre',
+                    'handler' => 'element',
+                    'text' => $Element,
+                ),
+            );
+
+            return $Block;
+        }
+    }
+
+    protected function blockFencedCodeContinue($Line, $Block)
+    {
+        if (isset($Block['complete']))
+        {
+            return;
+        }
+
+        if (isset($Block['interrupted']))
+        {
+            $Block['element']['text']['text'] .= "\n";
+
+            unset($Block['interrupted']);
+        }
+
+        if (preg_match('/^'.$Block['char'].'{3,}[ ]*$/', $Line['text']))
+        {
+            $Block['element']['text']['text'] = substr($Block['element']['text']['text'], 1);
+
+            $Block['complete'] = true;
+
+            return $Block;
+        }
+
+        $Block['element']['text']['text'] .= "\n".$Line['body'];;
+
+        return $Block;
+    }
+
+    protected function blockFencedCodeComplete($Block)
+    {
+        $text = $Block['element']['text']['text'];
+
+        $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8');
+
+        $Block['element']['text']['text'] = $text;
+
+        return $Block;
+    }
+
+    #
+    # Header
+
+    protected function blockHeader($Line)
+    {
+        if (isset($Line['text'][1]))
+        {
+            $level = 1;
+
+            while (isset($Line['text'][$level]) and $Line['text'][$level] === '#')
+            {
+                $level ++;
+            }
+
+            if ($level > 6)
+            {
+                return;
+            }
+
+            $text = trim($Line['text'], '# ');
+
+            $Block = array(
+                'element' => array(
+                    'name' => 'h' . min(6, $level),
+                    'text' => $text,
+                    'handler' => 'line',
+                ),
+            );
+
+            return $Block;
+        }
+    }
+
+    #
+    # List
+
+    protected function blockList($Line)
+    {
+        list($name, $pattern) = $Line['text'][0] <= '-' ? array('ul', '[*+-]') : array('ol', '[0-9]+[.]');
+
+        if (preg_match('/^('.$pattern.'[ ]+)(.*)/', $Line['text'], $matches))
+        {
+            $Block = array(
+                'indent' => $Line['indent'],
+                'pattern' => $pattern,
+                'element' => array(
+                    'name' => $name,
+                    'handler' => 'elements',
+                ),
+            );
+
+            $Block['li'] = array(
+                'name' => 'li',
+                'handler' => 'li',
+                'text' => array(
+                    $matches[2],
+                ),
+            );
+
+            $Block['element']['text'] []= & $Block['li'];
+
+            return $Block;
+        }
+    }
+
+    protected function blockListContinue($Line, array $Block)
+    {
+        if ($Block['indent'] === $Line['indent'] and preg_match('/^'.$Block['pattern'].'(?:[ ]+(.*)|$)/', $Line['text'], $matches))
+        {
+            if (isset($Block['interrupted']))
+            {
+                $Block['li']['text'] []= '';
+
+                unset($Block['interrupted']);
+            }
+
+            unset($Block['li']);
+
+            $text = isset($matches[1]) ? $matches[1] : '';
+
+            $Block['li'] = array(
+                'name' => 'li',
+                'handler' => 'li',
+                'text' => array(
+                    $text,
+                ),
+            );
+
+            $Block['element']['text'] []= & $Block['li'];
+
+            return $Block;
+        }
+
+        if ($Line['text'][0] === '[' and $this->blockReference($Line))
+        {
+            return $Block;
+        }
+
+        if ( ! isset($Block['interrupted']))
+        {
+            $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']);
+
+            $Block['li']['text'] []= $text;
+
+            return $Block;
+        }
+
+        if ($Line['indent'] > 0)
+        {
+            $Block['li']['text'] []= '';
+
+            $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']);
+
+            $Block['li']['text'] []= $text;
+
+            unset($Block['interrupted']);
+
+            return $Block;
+        }
+    }
+
+    #
+    # Quote
+
+    protected function blockQuote($Line)
+    {
+        if (preg_match('/^>[ ]?(.*)/', $Line['text'], $matches))
+        {
+            $Block = array(
+                'element' => array(
+                    'name' => 'blockquote',
+                    'handler' => 'lines',
+                    'text' => (array) $matches[1],
+                ),
+            );
+
+            return $Block;
+        }
+    }
+
+    protected function blockQuoteContinue($Line, array $Block)
+    {
+        if ($Line['text'][0] === '>' and preg_match('/^>[ ]?(.*)/', $Line['text'], $matches))
+        {
+            if (isset($Block['interrupted']))
+            {
+                $Block['element']['text'] []= '';
+
+                unset($Block['interrupted']);
+            }
+
+            $Block['element']['text'] []= $matches[1];
+
+            return $Block;
+        }
+
+        if ( ! isset($Block['interrupted']))
+        {
+            $Block['element']['text'] []= $Line['text'];
+
+            return $Block;
+        }
+    }
+
+    #
+    # Rule
+
+    protected function blockRule($Line)
+    {
+        if (preg_match('/^(['.$Line['text'][0].'])([ ]*\1){2,}[ ]*$/', $Line['text']))
+        {
+            $Block = array(
+                'element' => array(
+                    'name' => 'hr'
+                ),
+            );
+
+            return $Block;
+        }
+    }
+
+    #
+    # Setext
+
+    protected function blockSetextHeader($Line, array $Block = null)
+    {
+        if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted']))
+        {
+            return;
+        }
+
+        if (chop($Line['text'], $Line['text'][0]) === '')
+        {
+            $Block['element']['name'] = $Line['text'][0] === '=' ? 'h1' : 'h2';
+
+            return $Block;
+        }
+    }
+
+    #
+    # Markup
+
+    protected function blockMarkup($Line)
+    {
+        if ($this->markupEscaped)
+        {
+            return;
+        }
+
+        if (preg_match('/^<(\w*)(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*(\/)?>/', $Line['text'], $matches))
+        {
+            if (in_array($matches[1], $this->textLevelElements))
+            {
+                return;
+            }
+
+            $Block = array(
+                'name' => $matches[1],
+                'depth' => 0,
+                'markup' => $Line['text'],
+            );
+
+            $length = strlen($matches[0]);
+
+            $remainder = substr($Line['text'], $length);
+
+            if (trim($remainder) === '')
+            {
+                if (isset($matches[2]) or in_array($matches[1], $this->voidElements))
+                {
+                    $Block['closed'] = true;
+
+                    $Block['void'] = true;
+                }
+            }
+            else
+            {
+                if (isset($matches[2]) or in_array($matches[1], $this->voidElements))
+                {
+                    return;
+                }
+
+                if (preg_match('/<\/'.$matches[1].'>[ ]*$/i', $remainder))
+                {
+                    $Block['closed'] = true;
+                }
+            }
+
+            return $Block;
+        }
+    }
+
+    protected function blockMarkupContinue($Line, array $Block)
+    {
+        if (isset($Block['closed']))
+        {
+            return;
+        }
+
+        if (preg_match('/^<'.$Block['name'].'(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*>/i', $Line['text'])) # open
+        {
+            $Block['depth'] ++;
+        }
+
+        if (preg_match('/(.*?)<\/'.$Block['name'].'>[ ]*$/i', $Line['text'], $matches)) # close
+        {
+            if ($Block['depth'] > 0)
+            {
+                $Block['depth'] --;
+            }
+            else
+            {
+                $Block['closed'] = true;
+            }
+        }
+
+        if (isset($Block['interrupted']))
+        {
+            $Block['markup'] .= "\n";
+
+            unset($Block['interrupted']);
+        }
+
+        $Block['markup'] .= "\n".$Line['body'];
+
+        return $Block;
+    }
+
+    #
+    # Reference
+
+    protected function blockReference($Line)
+    {
+        if (preg_match('/^\[(.+?)\]:[ ]*<?(\S+?)>?(?:[ ]+["\'(](.+)["\')])?[ ]*$/', $Line['text'], $matches))
+        {
+            $id = strtolower($matches[1]);
+
+            $Data = array(
+                'url' => $matches[2],
+                'title' => null,
+            );
+
+            if (isset($matches[3]))
+            {
+                $Data['title'] = $matches[3];
+            }
+
+            $this->DefinitionData['Reference'][$id] = $Data;
+
+            $Block = array(
+                'hidden' => true,
+            );
+
+            return $Block;
+        }
+    }
+
+    #
+    # Table
+
+    protected function blockTable($Line, array $Block = null)
+    {
+        if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted']))
+        {
+            return;
+        }
+
+        if (strpos($Block['element']['text'], '|') !== false and chop($Line['text'], ' -:|') === '')
+        {
+            $alignments = array();
+
+            $divider = $Line['text'];
+
+            $divider = trim($divider);
+            $divider = trim($divider, '|');
+
+            $dividerCells = explode('|', $divider);
+
+            foreach ($dividerCells as $dividerCell)
+            {
+                $dividerCell = trim($dividerCell);
+
+                if ($dividerCell === '')
+                {
+                    continue;
+                }
+
+                $alignment = null;
+
+                if ($dividerCell[0] === ':')
+                {
+                    $alignment = 'left';
+                }
+
+                if (substr($dividerCell, - 1) === ':')
+                {
+                    $alignment = $alignment === 'left' ? 'center' : 'right';
+                }
+
+                $alignments []= $alignment;
+            }
+
+            # ~
+
+            $HeaderElements = array();
+
+            $header = $Block['element']['text'];
+
+            $header = trim($header);
+            $header = trim($header, '|');
+
+            $headerCells = explode('|', $header);
+
+            foreach ($headerCells as $index => $headerCell)
+            {
+                $headerCell = trim($headerCell);
+
+                $HeaderElement = array(
+                    'name' => 'th',
+                    'text' => $headerCell,
+                    'handler' => 'line',
+                );
+
+                if (isset($alignments[$index]))
+                {
+                    $alignment = $alignments[$index];
+
+                    $HeaderElement['attributes'] = array(
+                        'style' => 'text-align: '.$alignment.';',
+                    );
+                }
+
+                $HeaderElements []= $HeaderElement;
+            }
+
+            # ~
+
+            $Block = array(
+                'alignments' => $alignments,
+                'identified' => true,
+                'element' => array(
+                    'name' => 'table',
+                    'handler' => 'elements',
+                ),
+            );
+
+            $Block['element']['text'] []= array(
+                'name' => 'thead',
+                'handler' => 'elements',
+            );
+
+            $Block['element']['text'] []= array(
+                'name' => 'tbody',
+                'handler' => 'elements',
+                'text' => array(),
+            );
+
+            $Block['element']['text'][0]['text'] []= array(
+                'name' => 'tr',
+                'handler' => 'elements',
+                'text' => $HeaderElements,
+            );
+
+            return $Block;
+        }
+    }
+
+    protected function blockTableContinue($Line, array $Block)
+    {
+        if (isset($Block['interrupted']))
+        {
+            return;
+        }
+
+        if ($Line['text'][0] === '|' or strpos($Line['text'], '|'))
+        {
+            $Elements = array();
+
+            $row = $Line['text'];
+
+            $row = trim($row);
+            $row = trim($row, '|');
+
+            preg_match_all('/(?:(\\\\[|])|[^|`]|`[^`]+`|`)+/', $row, $matches);
+
+            foreach ($matches[0] as $index => $cell)
+            {
+                $cell = trim($cell);
+
+                $Element = array(
+                    'name' => 'td',
+                    'handler' => 'line',
+                    'text' => $cell,
+                );
+
+                if (isset($Block['alignments'][$index]))
+                {
+                    $Element['attributes'] = array(
+                        'style' => 'text-align: '.$Block['alignments'][$index].';',
+                    );
+                }
+
+                $Elements []= $Element;
+            }
+
+            $Element = array(
+                'name' => 'tr',
+                'handler' => 'elements',
+                'text' => $Elements,
+            );
+
+            $Block['element']['text'][1]['text'] []= $Element;
+
+            return $Block;
+        }
+    }
+
+    #
+    # ~
+    #
+
+    protected function paragraph($Line)
+    {
+        $Block = array(
+            'element' => array(
+                'name' => 'div',
+                'text' => $Line['text'],
+                'handler' => 'line',
+            ),
+        );
+
+        return $Block;
+    }
+
+    #
+    # Inline Elements
+    #
+
+    protected $InlineTypes = array(
+        '"' => array('SpecialCharacter'),
+        '!' => array('Image'),
+        '&' => array('SpecialCharacter'),
+        '*' => array('Emphasis'),
+        ':' => array('Url'),
+        '<' => array('UrlTag', 'EmailTag', 'Markup', 'SpecialCharacter'),
+        '>' => array('SpecialCharacter'),
+        '[' => array('Link'),
+        '_' => array('Emphasis'),
+        '`' => array('Code'),
+        '~' => array('Strikethrough'),
+        '\\' => array('EscapeSequence'),
+    );
+
+    # ~
+
+    protected $inlineMarkerList = '!"*_&[:<>`~\\';
+
+    #
+    # ~
+    #
+
+    public function line($text)
+    {
+        $markup = '';
+
+        $unexaminedText = $text;
+
+        $markerPosition = 0;
+
+        while ($excerpt = strpbrk($unexaminedText, $this->inlineMarkerList))
+        {
+            $marker = $excerpt[0];
+
+            $markerPosition += strpos($unexaminedText, $marker);
+
+            $Excerpt = array('text' => $excerpt, 'context' => $text);
+
+            foreach ($this->InlineTypes[$marker] as $inlineType)
+            {
+                $Inline = $this->{'inline'.$inlineType}($Excerpt);
+
+                if ( ! isset($Inline))
+                {
+                    continue;
+                }
+
+                if (isset($Inline['position']) and $Inline['position'] > $markerPosition) # position is ahead of marker
+                {
+                    continue;
+                }
+
+                if ( ! isset($Inline['position']))
+                {
+                    $Inline['position'] = $markerPosition;
+                }
+
+                $unmarkedText = substr($text, 0, $Inline['position']);
+
+                $markup .= $this->unmarkedText($unmarkedText);
+
+                $markup .= isset($Inline['markup']) ? $Inline['markup'] : $this->element($Inline['element']);
+
+                $text = substr($text, $Inline['position'] + $Inline['extent']);
+
+                $unexaminedText = $text;
+
+                $markerPosition = 0;
+
+                continue 2;
+            }
+
+            $unexaminedText = substr($excerpt, 1);
+
+            $markerPosition ++;
+        }
+
+        $markup .= $this->unmarkedText($text);
+
+        return $markup;
+    }
+
+    #
+    # ~
+    #
+
+    protected function inlineCode($Excerpt)
+    {
+        $marker = $Excerpt['text'][0];
+
+        if (preg_match('/^('.$marker.'+)[ ]*(.+?)[ ]*(?<!'.$marker.')\1(?!'.$marker.')/s', $Excerpt['text'], $matches))
+        {
+            $text = $matches[2];
+            $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8');
+            $text = preg_replace("/[ ]*\n/", ' ', $text);
+
+            return array(
+                'extent' => strlen($matches[0]),
+                'element' => array(
+                    'name' => 'code',
+                    'text' => $text,
+                ),
+            );
+        }
+    }
+
+    protected function inlineEmailTag($Excerpt)
+    {
+        if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<((mailto:)?\S+?@\S+?)>/i', $Excerpt['text'], $matches))
+        {
+            $url = $matches[1];
+
+            if ( ! isset($matches[2]))
+            {
+                $url = 'mailto:' . $url;
+            }
+
+            return array(
+                'extent' => strlen($matches[0]),
+                'element' => array(
+                    'name' => 'a',
+                    'text' => $matches[1],
+                    'attributes' => array(
+                        'href' => $url,
+                    ),
+                ),
+            );
+        }
+    }
+
+    protected function inlineEmphasis($Excerpt)
+    {
+        if ( ! isset($Excerpt['text'][1]))
+        {
+            return;
+        }
+
+        $marker = $Excerpt['text'][0];
+
+        if ($Excerpt['text'][1] === $marker and preg_match($this->StrongRegex[$marker], $Excerpt['text'], $matches))
+        {
+            $emphasis = 'strong';
+        }
+        elseif (preg_match($this->EmRegex[$marker], $Excerpt['text'], $matches))
+        {
+            $emphasis = 'em';
+        }
+        else
+        {
+            return;
+        }
+
+        return array(
+            'extent' => strlen($matches[0]),
+            'element' => array(
+                'name' => $emphasis,
+                'handler' => 'line',
+                'text' => $matches[1],
+            ),
+        );
+    }
+
+    protected function inlineEscapeSequence($Excerpt)
+    {
+        if (isset($Excerpt['text'][1]) and in_array($Excerpt['text'][1], $this->specialCharacters))
+        {
+            return array(
+                'markup' => $Excerpt['text'][1],
+                'extent' => 2,
+            );
+        }
+    }
+
+    protected function inlineImage($Excerpt)
+    {
+        if ( ! isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '[')
+        {
+            return;
+        }
+
+        $Excerpt['text']= substr($Excerpt['text'], 1);
+
+        $Link = $this->inlineLink($Excerpt);
+
+        if ($Link === null)
+        {
+            return;
+        }
+
+        $Inline = array(
+            'extent' => $Link['extent'] + 1,
+            'element' => array(
+                'name' => 'img',
+                'attributes' => array(
+                    'src' => $Link['element']['attributes']['href'],
+                    'alt' => $Link['element']['text'],
+                ),
+            ),
+        );
+
+        $Inline['element']['attributes'] += $Link['element']['attributes'];
+
+        unset($Inline['element']['attributes']['href']);
+
+        return $Inline;
+    }
+
+    protected function inlineLink($Excerpt)
+    {
+        $Element = array(
+            'name' => 'a',
+            'handler' => 'line',
+            'text' => null,
+            'attributes' => array(
+                'href' => null,
+                'title' => null,
+            ),
+        );
+
+        $extent = 0;
+
+        $remainder = $Excerpt['text'];
+
+        if (preg_match('/\[((?:[^][]|(?R))*)\]/', $remainder, $matches))
+        {
+            $Element['text'] = $matches[1];
+
+            $extent += strlen($matches[0]);
+
+            $remainder = substr($remainder, $extent);
+        }
+        else
+        {
+            return;
+        }
+
+        if (preg_match('/^[(]((?:[^ ()]|[(][^ )]+[)])+)(?:[ ]+("[^"]*"|\'[^\']*\'))?[)]/', $remainder, $matches))
+        {
+            $Element['attributes']['href'] = $matches[1];
+
+            if (isset($matches[2]))
+            {
+                $Element['attributes']['title'] = substr($matches[2], 1, - 1);
+            }
+
+            $extent += strlen($matches[0]);
+        }
+        else
+        {
+            if (preg_match('/^\s*\[(.*?)\]/', $remainder, $matches))
+            {
+                $definition = strlen($matches[1]) ? $matches[1] : $Element['text'];
+                $definition = strtolower($definition);
+
+                $extent += strlen($matches[0]);
+            }
+            else
+            {
+                $definition = strtolower($Element['text']);
+            }
+
+            if ( ! isset($this->DefinitionData['Reference'][$definition]))
+            {
+                return;
+            }
+
+            $Definition = $this->DefinitionData['Reference'][$definition];
+
+            $Element['attributes']['href'] = $Definition['url'];
+            $Element['attributes']['title'] = $Definition['title'];
+        }
+
+        $Element['attributes']['href'] = str_replace(array('&', '<'), array('&amp;', '&lt;'), $Element['attributes']['href']);
+
+        return array(
+            'extent' => $extent,
+            'element' => $Element,
+        );
+    }
+
+    protected function inlineMarkup($Excerpt)
+    {
+        if ($this->markupEscaped or strpos($Excerpt['text'], '>') === false)
+        {
+            return;
+        }
+
+        if ($Excerpt['text'][1] === '/' and preg_match('/^<\/\w*[ ]*>/s', $Excerpt['text'], $matches))
+        {
+            return array(
+                'markup' => $matches[0],
+                'extent' => strlen($matches[0]),
+            );
+        }
+
+        if ($Excerpt['text'][1] === '!' and preg_match('/^<!---?[^>-](?:-?[^-])*-->/s', $Excerpt['text'], $matches))
+        {
+            return array(
+                'markup' => $matches[0],
+                'extent' => strlen($matches[0]),
+            );
+        }
+
+        if ($Excerpt['text'][1] !== ' ' and preg_match('/^<\w*(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*\/?>/s', $Excerpt['text'], $matches))
+        {
+            return array(
+                'markup' => $matches[0],
+                'extent' => strlen($matches[0]),
+            );
+        }
+    }
+
+    protected function inlineSpecialCharacter($Excerpt)
+    {
+        if ($Excerpt['text'][0] === '&' and ! preg_match('/^&#?\w+;/', $Excerpt['text']))
+        {
+            return array(
+                'markup' => '&amp;',
+                'extent' => 1,
+            );
+        }
+
+        $SpecialCharacter = array('>' => 'gt', '<' => 'lt', '"' => 'quot');
+
+        if (isset($SpecialCharacter[$Excerpt['text'][0]]))
+        {
+            return array(
+                'markup' => '&'.$SpecialCharacter[$Excerpt['text'][0]].';',
+                'extent' => 1,
+            );
+        }
+    }
+
+    protected function inlineStrikethrough($Excerpt)
+    {
+        if ( ! isset($Excerpt['text'][1]))
+        {
+            return;
+        }
+
+        if ($Excerpt['text'][1] === '~' and preg_match('/^~~(?=\S)(.+?)(?<=\S)~~/', $Excerpt['text'], $matches))
+        {
+            return array(
+                'extent' => strlen($matches[0]),
+                'element' => array(
+                    'name' => 'del',
+                    'text' => $matches[1],
+                    'handler' => 'line',
+                ),
+            );
+        }
+    }
+
+    protected function inlineUrl($Excerpt)
+    {
+        if ($this->urlsLinked !== true or ! isset($Excerpt['text'][2]) or $Excerpt['text'][2] !== '/')
+        {
+            return;
+        }
+
+        if (preg_match('/\bhttps?:[\/]{2}[^\s<]+\b\/*/ui', $Excerpt['context'], $matches, PREG_OFFSET_CAPTURE))
+        {
+            $Inline = array(
+                'extent' => strlen($matches[0][0]),
+                'position' => $matches[0][1],
+                'element' => array(
+                    'name' => 'a',
+                    'text' => $matches[0][0],
+                    'attributes' => array(
+                        'href' => $matches[0][0],
+                    ),
+                ),
+            );
+
+            return $Inline;
+        }
+    }
+
+    protected function inlineUrlTag($Excerpt)
+    {
+        if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<(\w+:\/{2}[^ >]+)>/i', $Excerpt['text'], $matches))
+        {
+            $url = str_replace(array('&', '<'), array('&amp;', '&lt;'), $matches[1]);
+
+            return array(
+                'extent' => strlen($matches[0]),
+                'element' => array(
+                    'name' => 'a',
+                    'text' => $url,
+                    'attributes' => array(
+                        'href' => $url,
+                    ),
+                ),
+            );
+        }
+    }
+
+    # ~
+
+    protected function unmarkedText($text)
+    {
+        if ($this->breaksEnabled)
+        {
+            $text = preg_replace('/[ ]*\n/', "<br />\n", $text);
+        }
+        else
+        {
+            $text = preg_replace('/(?:[ ][ ]+|[ ]*\\\\)\n/', "<br />\n", $text);
+            $text = str_replace(" \n", "\n", $text);
+        }
+
+        return $text;
+    }
+
+    #
+    # Handlers
+    #
+
+    protected function element(array $Element)
+    {
+        $markup = '<'.$Element['name'];
+
+        if (isset($Element['attributes']))
+        {
+            foreach ($Element['attributes'] as $name => $value)
+            {
+                if ($value === null)
+                {
+                    continue;
+                }
+
+                $markup .= ' '.$name.'="'.$value.'"';
+            }
+        }
+
+        if (isset($Element['text']))
+        {
+            $markup .= '>';
+
+            if (isset($Element['handler']))
+            {
+                $markup .= $this->{$Element['handler']}($Element['text']);
+            }
+            else
+            {
+                $markup .= $Element['text'];
+            }
+
+            $markup .= '</'.$Element['name'].'>';
+        }
+        else
+        {
+            $markup .= ' />';
+        }
+
+        return $markup;
+    }
+
+    protected function elements(array $Elements)
+    {
+        $markup = '';
+
+        foreach ($Elements as $Element)
+        {
+            $markup .= "\n" . $this->element($Element);
+        }
+
+        $markup .= "\n";
+
+        return $markup;
+    }
+
+    # ~
+
+    protected function li($lines)
+    {
+        $markup = $this->lines($lines);
+
+        $trimmedMarkup = trim($markup);
+
+        if ( ! in_array('', $lines) and substr($trimmedMarkup, 0, 3) === '<p>')
+        {
+            $markup = $trimmedMarkup;
+            $markup = substr($markup, 3);
+
+            $position = strpos($markup, "</p>");
+
+            $markup = substr_replace($markup, '', $position, 4);
+        }
+
+        return $markup;
+    }
+
+    #
+    # Deprecated Methods
+    #
+
+    function parse($text)
+    {
+        $markup = $this->text($text);
+
+        return $markup;
+    }
+
+    #
+    # Static Methods
+    #
+
+    static function instance($name = 'default')
+    {
+        if (isset(self::$instances[$name]))
+        {
+            return self::$instances[$name];
+        }
+
+        $instance = new self();
+
+        self::$instances[$name] = $instance;
+
+        return $instance;
+    }
+
+    private static $instances = array();
+
+    #
+    # Fields
+    #
+
+    protected $DefinitionData;
+
+    #
+    # Read-Only
+
+    protected $specialCharacters = array(
+        '\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!', '|',
+    );
+
+    protected $StrongRegex = array(
+        '*' => '/^[*]{2}((?:\\\\\*|[^*]|[*][^*]*[*])+?)[*]{2}(?![*])/s',
+        '_' => '/^__((?:\\\\_|[^_]|_[^_]*_)+?)__(?!_)/us',
+    );
+
+    protected $EmRegex = array(
+        '*' => '/^[*]((?:\\\\\*|[^*]|[*][*][^*]+?[*][*])+?)[*](?![*])/s',
+        '_' => '/^_((?:\\\\_|[^_]|__[^_]*__)+?)_(?!_)\b/us',
+    );
+
+    protected $regexHtmlAttribute = '[a-zA-Z_:][\w:.-]*(?:\s*=\s*(?:[^"\'=<>`\s]+|"[^"]*"|\'[^\']*\'))?';
+
+    protected $voidElements = array(
+        'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source',
+    );
+
+    protected $textLevelElements = array(
+        'a', 'br', 'bdo', 'abbr', 'blink', 'nextid', 'acronym', 'basefont',
+        'b', 'em', 'big', 'cite', 'small', 'spacer', 'listing',
+        'i', 'rp', 'del', 'code',          'strike', 'marquee',
+        'q', 'rt', 'ins', 'font',          'strong',
+        's', 'tt', 'sub', 'mark',
+        'u', 'xm', 'sup', 'nobr',
+        'var', 'ruby',
+        'wbr', 'span',
+        'time',
+    );
+}
\ No newline at end of file