From 17196a2ff31c4eb65fa9ecff6f7208171e26059b Mon Sep 17 00:00:00 2001 From: Ruben Davila <rdavila84@gmail.com> Date: Fri, 23 Dec 2016 00:44:02 -0500 Subject: [PATCH] Backport backend work for time tracking. --- .../javascripts/lib/vue_resource.js.es6 | 2 + .../stylesheets/framework/variables.scss | 2 + app/helpers/issuables_helper.rb | 9 ++ app/models/concerns/issuable.rb | 1 + app/models/concerns/time_trackable.rb | 58 ++++++++++++ app/models/timelog.rb | 6 ++ app/serializers/issuable_entity.rb | 4 + app/services/issuable_base_service.rb | 26 +++++- .../slash_commands/interpret_service.rb | 47 ++++++++++ app/services/system_note_service.rb | 51 +++++++++++ ...23034433_add_time_estimate_to_issuables.rb | 30 +++++++ db/migrate/20161223034646_create_timelogs.rb | 38 ++++++++ db/schema.rb | 14 +++ doc/user/project/slash_commands.md | 4 + doc/workflow/README.md | 1 + .../time-tracking/time-tracking-example.png | Bin 0 -> 48350 bytes .../time-tracking/time-tracking-sidebar.png | Bin 0 -> 19467 bytes doc/workflow/time_tracking.md | 76 ++++++++++++++++ lib/gitlab/import_export/import_export.yml | 2 + lib/gitlab/time_tracking_formatter.rb | 30 +++++++ .../projects/issues_controller_spec.rb | 48 ++++++---- spec/factories/timelogs.rb | 9 ++ .../issues/user_uses_slash_commands_spec.rb | 26 ++++++ spec/lib/gitlab/import_export/all_models.yml | 5 ++ .../import_export/safe_model_attributes.yml | 10 +++ spec/models/concerns/issuable_spec.rb | 38 ++++++++ spec/models/timelog_spec.rb | 10 +++ .../notes/slash_commands_service_spec.rb | 12 +++ .../slash_commands/interpret_service_spec.rb | 85 ++++++++++++++++++ spec/services/system_note_service_spec.rb | 65 ++++++++++++++ 30 files changed, 692 insertions(+), 17 deletions(-) create mode 100644 app/assets/javascripts/lib/vue_resource.js.es6 create mode 100644 app/models/concerns/time_trackable.rb create mode 100644 app/models/timelog.rb create mode 100644 db/migrate/20161223034433_add_time_estimate_to_issuables.rb create mode 100644 db/migrate/20161223034646_create_timelogs.rb create mode 100644 doc/workflow/time-tracking/time-tracking-example.png create mode 100644 doc/workflow/time-tracking/time-tracking-sidebar.png create mode 100644 doc/workflow/time_tracking.md create mode 100644 lib/gitlab/time_tracking_formatter.rb create mode 100644 spec/factories/timelogs.rb create mode 100644 spec/models/timelog_spec.rb diff --git a/app/assets/javascripts/lib/vue_resource.js.es6 b/app/assets/javascripts/lib/vue_resource.js.es6 new file mode 100644 index 00000000000..eff1dcabfa2 --- /dev/null +++ b/app/assets/javascripts/lib/vue_resource.js.es6 @@ -0,0 +1,2 @@ +//= require vue +//= require vue-resource diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss index 4baf6ee781a..ee1c95fd373 100644 --- a/app/assets/stylesheets/framework/variables.scss +++ b/app/assets/stylesheets/framework/variables.scss @@ -56,6 +56,7 @@ $black-transparent: rgba(0, 0, 0, 0.3); $border-white-light: darken($white-light, $darken-border-factor); $border-white-normal: darken($white-normal, $darken-border-factor); +$border-gray-light: darken($gray-light, $darken-border-factor); $border-gray-normal: darken($gray-normal, $darken-border-factor); $border-gray-dark: darken($white-normal, $darken-border-factor); @@ -274,6 +275,7 @@ $dropdown-hover-color: #3b86ff; */ $btn-active-gray: #ececec; $btn-active-gray-light: e4e7ed; +$btn-white-active: #848484; /* * Badges diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb index 1c213983a5b..e5bb8b93e76 100644 --- a/app/helpers/issuables_helper.rb +++ b/app/helpers/issuables_helper.rb @@ -30,6 +30,15 @@ module IssuablesHelper end end + def serialize_issuable(issuable) + case issuable + when Issue + IssueSerializer.new.represent(issuable).to_json + when MergeRequest + MergeRequestSerializer.new.represent(issuable).to_json + end + end + def template_dropdown_tag(issuable, &block) title = selected_template(issuable) || "Choose a template" options = { diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index 5e63825bf99..3517969eabc 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -13,6 +13,7 @@ module Issuable include StripAttribute include Awardable include Taskable + include TimeTrackable included do cache_markdown_field :title, pipeline: :single_line diff --git a/app/models/concerns/time_trackable.rb b/app/models/concerns/time_trackable.rb new file mode 100644 index 00000000000..6fa2af4e4e6 --- /dev/null +++ b/app/models/concerns/time_trackable.rb @@ -0,0 +1,58 @@ +# == TimeTrackable concern +# +# Contains functionality related to objects that support time tracking. +# +# Used by Issue and MergeRequest. +# + +module TimeTrackable + extend ActiveSupport::Concern + + included do + attr_reader :time_spent + + alias_method :time_spent?, :time_spent + + default_value_for :time_estimate, value: 0, allows_nil: false + + has_many :timelogs, as: :trackable, dependent: :destroy + end + + def spend_time(seconds, user) + return if seconds == 0 + + @time_spent = seconds + @time_spent_user = user + + if seconds == :reset + reset_spent_time + else + add_or_subtract_spent_time + end + end + + def total_time_spent + timelogs.sum(:time_spent) + end + + def human_total_time_spent + Gitlab::TimeTrackingFormatter.output(total_time_spent) + end + + def human_time_estimate + Gitlab::TimeTrackingFormatter.output(time_estimate) + end + + private + + def reset_spent_time + timelogs.new(time_spent: total_time_spent * -1, user: @time_spent_user) + end + + def add_or_subtract_spent_time + # Exit if time to subtract exceeds the total time spent. + return if time_spent < 0 && (time_spent.abs > total_time_spent) + + timelogs.new(time_spent: time_spent, user: @time_spent_user) + end +end diff --git a/app/models/timelog.rb b/app/models/timelog.rb new file mode 100644 index 00000000000..f768c4e3da5 --- /dev/null +++ b/app/models/timelog.rb @@ -0,0 +1,6 @@ +class Timelog < ActiveRecord::Base + validates :time_spent, :user, presence: true + + belongs_to :trackable, polymorphic: true + belongs_to :user +end diff --git a/app/serializers/issuable_entity.rb b/app/serializers/issuable_entity.rb index 17c9160cb19..29aecb50849 100644 --- a/app/serializers/issuable_entity.rb +++ b/app/serializers/issuable_entity.rb @@ -13,4 +13,8 @@ class IssuableEntity < Grape::Entity expose :created_at expose :updated_at expose :deleted_at + expose :time_estimate + expose :total_time_spent + expose :human_time_estimate + expose :human_total_time_spent end diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb index 4ce5fd993d9..7491c256b99 100644 --- a/app/services/issuable_base_service.rb +++ b/app/services/issuable_base_service.rb @@ -36,6 +36,14 @@ class IssuableBaseService < BaseService end end + def create_time_estimate_note(issuable) + SystemNoteService.change_time_estimate(issuable, issuable.project, current_user) + end + + def create_time_spent_note(issuable) + SystemNoteService.change_time_spent(issuable, issuable.project, current_user) + end + def filter_params(issuable) ability_name = :"admin_#{issuable.to_ability_name}" @@ -156,6 +164,7 @@ class IssuableBaseService < BaseService def create(issuable) merge_slash_commands_into_params!(issuable) filter_params(issuable) + change_time_spent(issuable) params.delete(:state_event) params[:author] ||= current_user @@ -198,13 +207,14 @@ class IssuableBaseService < BaseService change_subscription(issuable) change_todo(issuable) filter_params(issuable) + time_spent = change_time_spent(issuable) old_labels = issuable.labels.to_a old_mentioned_users = issuable.mentioned_users.to_a label_ids = process_label_ids(params, existing_label_ids: issuable.label_ids) params[:label_ids] = label_ids if labels_changing?(issuable.label_ids, label_ids) - if params.present? && update_issuable(issuable, params) + if (params.present? || time_spent) && update_issuable(issuable, params) # We do not touch as it will affect a update on updated_at field ActiveRecord::Base.no_touching do handle_common_system_notes(issuable, old_labels: old_labels) @@ -251,6 +261,12 @@ class IssuableBaseService < BaseService end end + def change_time_spent(issuable) + time_spent = params.delete(:spend_time) + + issuable.spend_time(time_spent, current_user) if time_spent + end + def has_changes?(issuable, old_labels: []) valid_attrs = [:title, :description, :assignee_id, :milestone_id, :target_branch] @@ -272,6 +288,14 @@ class IssuableBaseService < BaseService create_task_status_note(issuable) end + if issuable.previous_changes.include?('time_estimate') + create_time_estimate_note(issuable) + end + + if issuable.time_spent? + create_time_spent_note(issuable) + end + create_labels_note(issuable, old_labels) if issuable.labels != old_labels end end diff --git a/app/services/slash_commands/interpret_service.rb b/app/services/slash_commands/interpret_service.rb index d75c5b1800e..ea00415ae1f 100644 --- a/app/services/slash_commands/interpret_service.rb +++ b/app/services/slash_commands/interpret_service.rb @@ -243,6 +243,53 @@ module SlashCommands @updates[:wip_event] = issuable.work_in_progress? ? 'unwip' : 'wip' end + desc 'Set time estimate' + params '<1w 3d 2h 14m>' + condition do + current_user.can?(:"admin_#{issuable.to_ability_name}", project) + end + command :estimate do |raw_duration| + time_estimate = Gitlab::TimeTrackingFormatter.parse(raw_duration) + + if time_estimate + @updates[:time_estimate] = time_estimate + end + end + + desc 'Add or substract spent time' + params '<1h 30m | -1h 30m>' + condition do + current_user.can?(:"admin_#{issuable.to_ability_name}", issuable) + end + command :spend do |raw_duration| + reduce_time = raw_duration.sub!(/\A-/, '') + time_spent = Gitlab::TimeTrackingFormatter.parse(raw_duration) + + if time_spent + time_spent *= -1 if reduce_time + + @updates[:spend_time] = time_spent + end + end + + desc 'Remove time estimate' + condition do + issuable.persisted? && + current_user.can?(:"admin_#{issuable.to_ability_name}", project) + end + command :remove_estimate do + @updates[:time_estimate] = 0 + end + + desc 'Remove spent time' + condition do + issuable.persisted? && + current_user.can?(:"admin_#{issuable.to_ability_name}", project) + end + command :remove_time_spent do + @updates[:spend_time] = :reset + end + # This is a dummy command, so that it appears in the autocomplete commands desc 'CC' params '@user' diff --git a/app/services/system_note_service.rb b/app/services/system_note_service.rb index 7613ecd5021..5ca2551ee61 100644 --- a/app/services/system_note_service.rb +++ b/app/services/system_note_service.rb @@ -109,6 +109,57 @@ module SystemNoteService create_note(noteable: noteable, project: project, author: author, note: body) end + # Called when the estimated time of a Noteable is changed + # + # noteable - Noteable object + # project - Project owning noteable + # author - User performing the change + # time_estimate - Estimated time + # + # Example Note text: + # + # "Changed estimate of this issue to 3d 5h" + # + # Returns the created Note object + + def change_time_estimate(noteable, project, author) + parsed_time = Gitlab::TimeTrackingFormatter.output(noteable.time_estimate) + body = if noteable.time_estimate == 0 + "Removed time estimate on this #{noteable.human_class_name}" + else + "Changed time estimate of this #{noteable.human_class_name} to #{parsed_time}" + end + + create_note(noteable: noteable, project: project, author: author, note: body) + end + + # Called when the spent time of a Noteable is changed + # + # noteable - Noteable object + # project - Project owning noteable + # author - User performing the change + # time_spent - Spent time + # + # Example Note text: + # + # "Added 2h 30m of time spent on this issue" + # + # Returns the created Note object + + def change_time_spent(noteable, project, author) + time_spent = noteable.time_spent + + if time_spent == :reset + body = "Removed time spent on this #{noteable.human_class_name}" + else + parsed_time = Gitlab::TimeTrackingFormatter.output(time_spent.abs) + action = time_spent > 0 ? 'Added' : 'Subtracted' + body = "#{action} #{parsed_time} of time spent on this #{noteable.human_class_name}" + end + + create_note(noteable: noteable, project: project, author: author, note: body) + end + # Called when the status of a Noteable is changed # # noteable - Noteable object diff --git a/db/migrate/20161223034433_add_time_estimate_to_issuables.rb b/db/migrate/20161223034433_add_time_estimate_to_issuables.rb new file mode 100644 index 00000000000..8d89756a9bc --- /dev/null +++ b/db/migrate/20161223034433_add_time_estimate_to_issuables.rb @@ -0,0 +1,30 @@ +# See http://doc.gitlab.com/ce/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class AddTimeEstimateToIssuables < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + # Set this constant to true if this migration requires downtime. + DOWNTIME = false + + # When a migration requires downtime you **must** uncomment the following + # constant and define a short and easy to understand explanation as to why the + # migration requires downtime. + # DOWNTIME_REASON = '' + + # When using the methods "add_concurrent_index" or "add_column_with_default" + # you must disable the use of transactions as these methods can not run in an + # existing transaction. When using "add_concurrent_index" make sure that this + # method is the _only_ method called in the migration, any other changes + # should go in a separate migration. This ensures that upon failure _only_ the + # index creation fails and can be retried or reverted easily. + # + # To disable transactions uncomment the following line and remove these + # comments: + # disable_ddl_transaction! + + def change + add_column :issues, :time_estimate, :integer + add_column :merge_requests, :time_estimate, :integer + end +end diff --git a/db/migrate/20161223034646_create_timelogs.rb b/db/migrate/20161223034646_create_timelogs.rb new file mode 100644 index 00000000000..d3353a67eec --- /dev/null +++ b/db/migrate/20161223034646_create_timelogs.rb @@ -0,0 +1,38 @@ +# See http://doc.gitlab.com/ce/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class CreateTimelogs < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + # Set this constant to true if this migration requires downtime. + DOWNTIME = false + + # When a migration requires downtime you **must** uncomment the following + # constant and define a short and easy to understand explanation as to why the + # migration requires downtime. + # DOWNTIME_REASON = '' + + # When using the methods "add_concurrent_index" or "add_column_with_default" + # you must disable the use of transactions as these methods can not run in an + # existing transaction. When using "add_concurrent_index" make sure that this + # method is the _only_ method called in the migration, any other changes + # should go in a separate migration. This ensures that upon failure _only_ the + # index creation fails and can be retried or reverted easily. + # + # To disable transactions uncomment the following line and remove these + # comments: + # disable_ddl_transaction! + + def change + create_table :timelogs do |t| + t.integer :time_spent, null: false + t.references :trackable, polymorphic: true + t.references :user + + t.timestamps null: false + end + + add_index :timelogs, [:trackable_type, :trackable_id] + add_index :timelogs, :user_id + end +end diff --git a/db/schema.rb b/db/schema.rb index c58a886b0fa..7815392c1c3 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -506,6 +506,7 @@ ActiveRecord::Schema.define(version: 20170106172224) do t.integer "lock_version" t.text "title_html" t.text "description_html" + t.integer "time_estimate" end add_index "issues", ["assignee_id"], name: "index_issues_on_assignee_id", using: :btree @@ -685,6 +686,7 @@ ActiveRecord::Schema.define(version: 20170106172224) do t.integer "lock_version" t.text "title_html" t.text "description_html" + t.integer "time_estimate" end add_index "merge_requests", ["assignee_id"], name: "index_merge_requests_on_assignee_id", using: :btree @@ -1128,6 +1130,18 @@ ActiveRecord::Schema.define(version: 20170106172224) do add_index "tags", ["name"], name: "index_tags_on_name", unique: true, using: :btree + create_table "timelogs", force: :cascade do |t| + t.integer "time_spent", null: false + t.integer "trackable_id" + t.string "trackable_type" + t.integer "user_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + add_index "timelogs", ["trackable_type", "trackable_id"], name: "index_timelogs_on_trackable_type_and_trackable_id", using: :btree + add_index "timelogs", ["user_id"], name: "index_timelogs_on_user_id", using: :btree + create_table "todos", force: :cascade do |t| t.integer "user_id", null: false t.integer "project_id", null: false diff --git a/doc/user/project/slash_commands.md b/doc/user/project/slash_commands.md index 5f6a6c6503e..87c9756ea5d 100644 --- a/doc/user/project/slash_commands.md +++ b/doc/user/project/slash_commands.md @@ -29,3 +29,7 @@ do. | <code>/due <in 2 days | this Friday | December 31st></code> | Set due date | | `/remove_due_date` | Remove due date | | `/wip` | Toggle the Work In Progress status | +| <code>/estimate <1w 3d 2h 14m></code> | Set time estimate | +| `/remove_estimate` | Remove estimated time | +| <code>/spend <1h 30m | -1h 5m></code> | Add or substract spent time | +| `/remove_time_spent` | Remove time spent | diff --git a/doc/workflow/README.md b/doc/workflow/README.md index 59a806de210..b317bd79ded 100644 --- a/doc/workflow/README.md +++ b/doc/workflow/README.md @@ -19,6 +19,7 @@ - [Slash commands](../user/project/slash_commands.md) - [Sharing a project with a group](share_with_group.md) - [Share projects with other groups](share_projects_with_other_groups.md) +- [Time tracking](time_tracking.md) - [Web Editor](../user/project/repository/web_editor.md) - [Releases](releases.md) - [Milestones](milestones.md) diff --git a/doc/workflow/time-tracking/time-tracking-example.png b/doc/workflow/time-tracking/time-tracking-example.png new file mode 100644 index 0000000000000000000000000000000000000000..bbcabb602d67655043daa1b55bd37674642ba91a GIT binary patch literal 48350 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 J<)R<`{vVvo(bNC{ literal 0 HcmV?d00001 diff --git a/doc/workflow/time-tracking/time-tracking-sidebar.png b/doc/workflow/time-tracking/time-tracking-sidebar.png new file mode 100644 index 0000000000000000000000000000000000000000..d1ff5571f95e7cd0d3bf284227727f3e2255e7ae GIT binary patch literal 19467 zcmdR$Wm{F@x9$N+r42wj1f{zhB&0<e7Tw+5EwSh>rKB6AQ@XoBV9~kg-gEiid!O?G z&YSbX%WJ}nC&x3!J${35MR`e#m+xP~!NFljONoDlgM()Q{vn|v13!s~9-jjKgLnKY zDGFCUO0)+DCk!VoF7nL{{%8dy#rSg~$|=Gds-27w{w*?%t{5s>e0A{zByIGAeS>+0 zmBd7h^5zn<(;`1KaYPa6?@~!bA25_Qu&GR`LRX#=Gqy($u6gAY#tu@I*RJnYwf;^Q z`Oe(V6*V=SWbP%Zfo|L5$Z@0)as64ockta!c^0Ia>@)F9;rfe{;oz$vKAk+@-Dwj` zAC7RX(O0zH?f;@pN&J8iE=)0w1}{HjRWmY6)5s7$@UUoEkw}y6Rh`E*i&7H_d!dqq z9}4F|X-!fv9_Y8i2pc3zom7^U0{B=jHUb-%Tt|5Z_=XhX9a#+3EK1zJXR3mP<L1@( z%ceR0fB!{CSp57j+nDwP1-EY>-(uUKQ1uoI&?yr#M6ZSyH0<qb{xoTGV*Z=f^?Qo@ znI~SR-XgxuFTWi^9&3hKWf&O7&c}pwL2iG8i(@XDPuiNbz0UsRuM{Tne&f+|;?qH< zPaps$NlzR{FZ8f|1$@--Y9rfyJJq2R2``~A%cGc=|M%a$!t8QVnwLv1k>@TBY4*fA zR0v-6M{zQYpT-35trjdw%Jz5S0wO=2_q<m47NF^UIWu%~wmCG!)UF-P5AFYAk$u0s zGk91t1}blVx=S<d#^9nyWf|m3#2@6z^a@9_3$)%++%jE-trdLu`s<AdrX(4r)>>W$ zxn`fo%ekRmLR;<LC_=SWx6P=5pubUlq`oZ=4?99kC`5L`8cq|Rhgz>!wJ>?MVyc&H zniG%em&!kqw!37TrOWD#efDhfqQm>+rqoB`Y1OzH&F3M&IMBj`kuz-Fu%cSg7-m^o zCGn`F>fRTtDIe!Jr{kJP8O{Ck0m9^)YPE2eH0b_s848n09bQZ+R74MoVF`SD0=_=C z_5zDv5v@Evo?I{~p4%YHeftxkRi%iA!@vhR)Ae_wV_3d7-6C~)xikf}FWnT*N4Rtw zuNEzbnhwgfg1>I$Cxd8x@20W`5nj<NZf?DOZo6)+09{}I)w%un-uO+&d^wUilzobY zO|(`UDb7jwbdVz3K~(#E@qvQ<z-rKTq%ez2{}%Dm6xO~096igHLWYLr>P3UR>h#Lg z0s$T@zNnU0jKB33Y}+4;%V-S~jT5hTbHP`<!sK*=?BK_^l*oQ#NTM1emf($^^NZMb zpKV$%XEpaGWteo%71JC{v)oN|B-(ZaPRwVgJj+XscSxU3Ls{)NdWug?(ydijACFz< z_>F!Y08`62ztYFbwc<2Yy=YOQGN!=eX#>oXSDESkQ3F#1Q=8ii1UkgTG^gz-C)d!j z0z5vr>^P<~g}utNlc9V*D)jsSX*nM)x$KwhC2|~A8UXuj$;?SWoX0gS%VzpGj;+6C zQ6aD~BZ$bN%GpIaUL8^{?_~S>G@g(04dKerEA?K|vn}NEyLJ2EFD;wpMh!X)F{oKT z7nhV5FR2SXoq-QH-|d9;%{qNSfchlI)2=HqRQFTN^cybxI>q2xR#a8j5B?(B+U0?| zK1f$V&$a4isKU6hDFqtq^C(F-`}F;HlCIBfllEuf7QuAywfoiUK|`>BYW=)H#1{%Y z9Vev^*g=Em6ou~H@L_-jbKu!dF?<;y%6(BeS|9##1w7hE?5cgcFy^CLfy3;2<Jx|& z^FhxYd;V`IDd=2tPOIj5S5l~W3-tyau!_t)2rX1D;dBoMq>%zuJHU#oUEEBwEY~0g zuRT9qb7VV_XM}{3`utwZhi(OB)?7Yy`Kb~_S{RbBki8>(yz0MN^*m`Joh|kI(a;nT z%lK41#7K9&?5J?t%hfh<FYSOn6u4<G0PUxo*}U(e5md5$rw8gOqz6j{#*Q90pMcOJ zd>Yn#Jb3`aJJ=_9RaFh_so8z(Ew1+45r<v^(*&^Z!zM?xO-C%&=Bq`ADLJl09oLn* zVPG<mIyNx*PdivoTFz(r_nDPTTdx*d*`(z9g~B_~qv6sGn$@)JKVOz&FWwzg=(;Qz zCwq+8&||beT~;I;CutP?tQ({)`6l_{H<Ctd;B>}G?UX#ykA>%676b#!onYyMx!3U` zWE~*_4P(5QNm@2V<(W~x^;X)qiEfyf<O~ms8tLqxAFtIk_?bZQ`F}-UF?^Hf-OFpj zGTpl^cWo_sIlF5X=8<a?v@ieh)GzGUZpf`WcprC*bZ&DH+A&Ooz@*${X=IKjEyRVn zYib^0H1hFk)8Oh?@VNp7b0B30^+Nm%R<vCthKEbPNM-V9fp*PW<91p}Zte?t_x?-E zMR%HCC>K4Vzgj;DQT6=B30lggeQ%Y6{c}Su(`_TX)%cUOMz~aIs?hW8ShBK$K;6R@ zjZo3h0G7{bV5_G|nR5{-JoM*7z}A*nh%h1uaqj|^^?R<9(YEWF_jTfHdF~%-s=LNX z{V}Li2)2|RN!(cJwr%dVM)UZg0h^nnhVe9MJFUS5>qd%H@1P9V@;s1)FQBmCI5D)O zpfKb{uYKk0Vn`r<3|eyBaDI|zvD;{*jQO71w31|Eg%^Y_nD9OMAWzc*HewIus~GxM zGhE|oX|l#{UeGj-s}<L^fqwAu#gsYh&{(%doTtAJpNV?oGGH>F@K$!dq_$vly-5d^ z&?b5IJ=ZUY(HjREFy0>>aq+;ikMG5!y+3%W&kiJ+A3xbMt*Fj$%QUIi7oli;cP;!H zgQb5~Za{o=Tm&IyV&QxcP~17*`9fFr&GyT5*W&{k?o=<(&qjV=5vy?BVI-m6<77*R zcQ{4BRU2$tG5J`{HojGzSDydPP(=N=?nN&x*4*iSf@PeZ<rBOBOJZ<eu#@1!U#vOr z5^Sp0y-fD=p-lp8#t$3Sh?m@doac1ZF!>HE@4V1bIZx?TT<7&e@9=}=JkoFY>D^;z zerL7PiwDl{8a7I2@#U42H(5BF3b;kIEdRLph>UH`ED`3?Q%AY7C(GI4vTWbi#B{ZC z;?rOS7*l6zd&~KzHD^8oId}Ig)Zve)K_kC4c0|;!C@XR94Q<NZLk^eLo?KS?*No!j z_GiI;IWb?iXlSm65cs%OPdh4nE=#HptA|wGiC(&Eb<+#D{>8M2av~l!6<dNvD<Xs0 zV<H?8@=JnZo455D0ApnQ=dD_)fx8Ch$zw!-ufhhXyk?YlCjI*(N2#^W(GShMoisd% zz9y^C-2_<Gy(6}q#fC9PhU?xei;{B5@XfK0Chl>~nBXN2T9XBMM<wRN$#5Mh_|+7p zxRE)}ORpZ8cIkL(6$N>sE^8D6z6VxDoRn1@J+(s=_=P6>W7D<t%)f|qoEd+8e=V?S z)iiCG|3&2_g)A`NQ_tnf@$-X-0=9m+Y35`;j!f5h9mrT?T&NV2+2-rSL@RZRnU8>D zK7PnFr6R-HNk|UiCVHe8Y2=Ha42n6?))<oa;8F8UhzFMs@?h129im6-d*awzSoWOW zkvfz0scJxt0l&xyv1@x#e|!tEo~p92(i!nB=Uaz>7h7)&Gs-C4AJgjT6@uWU=~?9m zVns#iB3!<MoAMfx%nL9iO%h0l?a3aIDJjpX5W+ijadyYD`1INF35nj~9^~ou(!jh` z=6qE2z2mI})g;L4f3B@LVqA~J`-y~PU^nJ|2fWT-U70Y)wnK_ChKh4Ctf1vT4lr=n z+v8Gtz;ly$?@v_~E5Qzd-SvwCxU1OC)EM^eNmQ!vDE6P9m|%Ck1@2M`=A)AV&h}Ud zGHI(k965K`UB$4wXqPoKC}L0}*%71-D5J~<VRtEg)*GkVzGU}-?M*VAU1~&RqYo!% zA|Q~*Hd0u?@27w{Q#U-t7Rg^L2TuJLjLg+}4MS79#HmR@+r!}y@4N*#0?s~=lNMa= zu`#in_f893&F5arRg^JPFf*}TaQ0eOwAQx~&&<iYELk^ze#W7E@?a~m)$n+%Igz?k zw>}RJE~`H01zL~muZqYUhp#Y@j_=K|WSQ3byjo)7d!D|QKndor_CcR2Db!l454*u$ z#gQaZ8bJSat1irT+Tk@z#3Lafc!9$tY`Hyh{vWqqEN9aJ_lLS51(ohcAUbFr9OXOF z)_ph$tZo|#^V1Ae8;(A>{ndxpb{c%gXg$<3>&4Hj`{sFHtzDCI(JYsi0<HAzK#M%k zrcSc)iPvI+tD#4^M1nuIb>>D5NryalmW~X=&&hFgXSWCHJS-A$cPJ71NAVh#1_&ad zsWkt3(^fvMl|uGjm!c}N*426UM`%(6W7996uhv~bXqT@fk5Ipyh3zCdznt8PXvu^c zdjV5Jh44r|9^3P#y64=TBU=|bkl&3Z)Z#NYfjdr<JQ=u;wI~alv<cxH%J79gDEXoo zCQn}6ya)>MH$lKznLFuSn7_to^e3sqk3u#ghRwVoCGbM*1g3kzhtqCnwza3kKB_Cg ziTYxblmsQ?yEiIJzh>hsUATiSIR@ASAn~6VOD|}1GPd1pBvx*8SGV1G!yJ1_68F61 z{tfcE)9HX+iY%+0jlc&ATO!B+tli-q!l=Uz>;5Pt(~Qd43jC24Sch4j$De>`z@k;F z@u0kU7DZQq`)`oL#f0P>ivCgJ!mn%k1r5_o6>9km^(>#eJrC1!*vSl90m1+}9un7O zdkEmumk&+if!u!h+&vVe+Z5{}>Dn|x9J<?e3XQaZ0lN^%*`$1z1<^FmPaHHAx?gZu zG%rldety`gJAF7G)4f{reZI@U!-_Jk-~Abp^yi&cX+gv}(E<=rYI8jcSp4-@8%qzK zgN$wgj)+ROSk0S6lm&si-CW~=56OokbCOH{LPPN!B!BpJI2-rSpe!%wK!DdfZM)99 zhZM&k$c}E<cB*L>2pV3S)U-dzo)nP@Wlv5igZ%HBMy6sxI*j=9`cgz&P9&`G(!HX8 zZMe{i4V_wn%{S|xg&6-X+y^mYGvwQ_C}_Y<sa5T=*an|>ZiTnF%L4N)o<ofAxSDCD zMz;AsyELw+sfg=qGHlXVf$c07LjMYw1Ys_6AfA<LjctO>NDPh?E+MOt1}xBRLIX^L z&3@GM2jC(k60kWj<U{{LX*s|&I4j%cF~U}h5n!1@&^6w{cB73bnRIEo2c@$#a6t~U zOh*0H!oZ+Ay#~IxGEG<{16-gJ052vNOG1J*GaXwB_n=@^N(Z>m>jz$pK~PN(TOKPw zY^~09DX||1T!=~JtR+*_d!FydSoXu(0N5mKgd<SiVp2~`vO@K(n<VZ6>W^##*jwgN z$(TsrYU=qT-SwNv7`(j6=>t6di9%rsSbr&)8L-2^=ykIzC!wN~uPlS<DgYC!r%A!Q z3o-h*P%fMYfd#%mXN1X4<Xyy=@-Sf!S;4xAq4N$lxWI3uO9?&5ong1>!@6m;TdfD{ z<_lOi$6pnR!MaHZbW>j}83}lO4k4_YAs{K@|1_}H+rW2z5_o1D86HdSJ~<XWyu%L1 z4T#)^4l3GL>)qniwbWT1@~~5Y7<mY=MyfVVdj(KneS#C_6WCsm>)~p9?Bx#u?)Fkr ze_W4APABuC9LEjzd_&u1nZrgnO%k527mMyk=EY3r-h*>pvEGTVG7KtD2klQKR#kuA zd54v*J!cYa9w}TFvLFCQx8?07>9e{Za9Sq;AxUoAH@){I2{T|NL=f<uYDkh+l3_GY zfx0HAn9U*AME^OCWC!jf+~Eas08Rxnl6*4iyt4OURo|E9=N)<6bjD_W!bDVAUsQF~ z`d88hM~VZ#Ve5_!cBZ73fB6g>5@KMi{_kI4{3t0M;42#nC8Ms1hDThM1LAwNB^#>i z!nP<=2(LiOg6@KO;x-F@dndAcoqgVm!ws%C3y*>{oG}x<W%90=83#9eJU4FNL%G(@ zqOU5Y9q~rtY+Uh-J$g;@mQ46r-bto(5w&$=+=;d0=Z+4r+bqd_*<aQR#2DN!sQ`^~ zZ$?75;uYjoxd_UrK9f9d1AbujlssP|;D{vBmH+-(_VBk}KW_*L6Nvq-y+clbIEkS0 z<-AqxgoN>``wjzObpE~pJMwna5WDU={>FT>sI{q;&z~W+hsvv+kF$DN?m8piv>xzk zUrlOO+i_$7D%n=#JT1&yhxw~WDci&6B9}A~(6}0{+8?jH7tP@S&)t`?Vc9`u0r1%d zfhRZ!RF%aF_f)8%nlLdUn(tUWdpe8T-k|YjBjVuo^O2M(8BwIhW3DbI5Fy{eXOvX5 zH38nJ@2|&s+IW$@P4DZK2Em=}Ss(0QwKJ+(WpUcmmPGs4LyXO(^ev}d5Z&iX-630_ z^K^$>NU|$Oc$GCbsmr`R<VPq8E$Q8O=-?}+mhq)oGhL#;+)Gw9GgnnFu(AXJ;}=Mg z7Bj(LEW|Gylu!CF{o4GLWLI}~F%Dnk<@2Gb5Z(2vr)|ZKh?^7l#?4au<5Kmq!%$+p zf?#85W!FpND2`dPeQuR8jN<#_=8Dm{{wd*~Yt!i0Yrei3cAZF`EM~L$KE2xmPR}G& z`^6>EFB>_XQ%FXm=nVJ5D5HNVm<!#k2O6KWUNcIPdOO{YJwJ>simQimS!o!`_6n=5 z&R^zON2<&L5`pe5G`U^7Z#ctoRHH)f%Tqd;5z9viK@6+tK}wuyNm)Iu?!yM2XL5S) zMpYk)7GvwhWSUS?yiree#964I%Bhxbngmgn;K~eL6#5ZHg%W?NT;_m^L<}|fVem6q zD8Kmz#MKMfe*aFEJNoRM+kOhM^aoMjTb-%1oIuRt_zNHwQ#p@N*4-@~oxSSfSo|Wd zN3V;GPyA;}gy=B=&HE=qSzkSs1VI3`Y>MKnuJ0plOo=<7P9+OmFW2BB(rN+9+Ck|R z5Jlw=3*H~LR)3NX!503?y!C}fXv5=GoAb{|r(1|Q9y=7!f9SZ@yd2SRUnDsATquKe zYqG*9YY5g#bCpRvq%D!{_rEsKd}k0@$88dSbh7yK^HX6e$-MN*^pnZL-X0O=KRpf5 z-!ujyLTdm;2@ly2frW(Tl78m6?f%#zEZw?Z!yQ;D2Z#uCph=1d`md2{XIr;Ao=0_m zxPj(69;gdE-E0os17ZR+KKmh$AGoT+n#twA9T7C!pvy`g`3(!qzaXHekV`%fj-5V~ z42KZfs82CAZp8_LFk5RSL8A!nErLUeo1TDmWZLYFqN5%IBBSEyPbH*hFj<S%Uj0h* zm_ji~&s<6fv<`TFU!7S6A5X~ns?dWnpYyPHhwp#33nSakY@H>yKjddc?4Svq53_N! zxAZ#eRjqm)Bx>2V*6kY>p}F3cZEXe400NS3@{e+NTZEGnzzZyO&=Vd*y~8c{nVeTH z98c;oLS_zh`o?1S>F(IIy}A5eWw(%Zt?*lFj=nHbUi3J;5wjJX`8Z6pOPn0Q7fis? zLl7n%WGBmSz$`Y+_O8bi^b-JFE0y|(i?f8^@F$z?7a)W15C4R!CH?Ji0$?(}-|Z>v zeB8-knW(DsvBovc!B+>`tdIy^&%ZT4a2yj*OJ3v+$lABCZty^-8dBObLfg{H>M)i- zy^F50t{LHk1ihC32-A!Hbm2&#|MgtE2i-oN`073Z8hKmvr`0#hSM!Eo16eX!L+k4m z*NU4xln{%qnxJneVzXS4Z;m$}ET;kAO#OhxC+d}93CHg1dk}h>KEbtAB|*OlO-l_- zLz#V!(0%ynwMn?PJ0cP7^Vo&grkIIf4TQDCgDe8is)0RjnS3WLj>JN}$3=x%nwa}% zei^>k&1+?OWto6YHAoy#R!RQA<~cp90L-OI15BN$vvGc3(tF;}{&?iD6)QPgB~2oF zJKra$diIq4e4G8n0IJD3_}skqSnjnaqgxyVWqO7(&1ltUXagtPzQdb==mT<X?>rrt z@-YP1ns$|p*bVYfqDf2B3ll?CyZwM%`-+Tg$Mz1q-WKt@hF8SWvL=~y_`*Ri5he5W ze@PNMf3tqWG$IU4fv+Z-V&5_lw<mrZ<~{)iaqv@N##d9~D0S0J=VC1^s%rGKczNEU zwzH0o+}hUgvWC^B26&}H5gV8Mx$E}lN8ZZcf7D61(f<PSQc2+YdG@oHbvKjm?NBk+ zBL--wO~D5m@2nXALinBvCWG28!9ThBUb}KAAgz}PG3#sdx&k6oMV@rF?(^MTT}`4` zFLL$hHUSy`O=<ISlXLs$<{9&MNecIMsW$yFuJ_>Q8?dt;(vuu<L4)Jw2uW0Z_dr}6 zPNxcK_gGwJLr|ENZVC~8Mfgh>>eW}CoEbPcl#zPN{pUpr-o+c>Fl-Xm_d-5ix3H)t zIV~yULfEY3*K7`^bGo+AO*iSRVAJ0a!og=?3C;RMK2T4<jtY+B^+2q0!{>1^tg_yc zF-rUhe&P65flpdgq__Q&gKG~XYY7#;j|YEJRscta7VYt>p`8Jy5fTqsmer}wOi(=n z`Gmq~nmaNYmyTJzP(62RD1OD^exJ~j{fAQB$9=UKAH7YyPW8Yu--kZmH`b1|Lg8U< z_GPz;Qz5?3*S-};VSsT`78;g&$uD=az$9LMmq1U2^tuV{v@ozmbp5T@H%da^yAM?o zZPA6atn2t$>x&(BYA7)#{)DzIRqsC;awzZ8%S-{9eYsW3S+Dc#PxgQse)b`#A6(c3 z#$=+ZW)Ww!S5(~_MJ(3ZHF&DkYy#u2V-6j|#wN-(KZ4&C8})Jz|2FXiO~6!E>4<0} zkUJ#NnHsU)8!OKMjw~JS8zH3i@oFjJ!$7Fe!{60~7?BAY)IOZpZUZ0>P}bW;Ic{Ua zWuO+y$x3S^#d(5IuxPA`;l7`h73k8{*}+NPg<*aK$R!-BzboC3`^C7D=yPLIKSXs9 z?!2u<ehi()FMQe|PY>(SiaYZm$bQmi2NCxKnql+?R2ggI&n1~rzkdwj?>9^UR;}tt zAKetP;mcd{Ip#0biEJj*)?I2>ttZ~Lm$-lZ_zm9rTS1ga&{9t2oK&TH!^2POmu%>g z%B`?sd(}BGqs(7_<nycHJeSxz#DizFBU>x(MYJld&Q*V^+ZF<}*y1U_1bs={qtDe& z%3w!`9THL9l2T3~J0!3)jhn}ImY|7Oo+TXTCxV}3j+7e+nfhl}n+*aPseQ|9`<AzX zVJJvmrBQAlt*|w;2<c4{QTJI(C>Rco?FDQ~NAdDBYL@6G%;C<a%+bY~?f_x_X<r~s z1D*X0IZGsZ8bMg59WK#JPb<!0?MUwQCJzN!iP6bFnA5U?)4asRvVxbv+8rNN&2#Gq z-^nbQrAMcc{206oa<ks8acZuv`*1Hp0PAgM&+y6i!0k@9?)_38oTc{woFP9VsM4hW z{sNmK!+JNpNAT1i>swq5c&_8umi3ikza7<_!>l?>^eAv1?^i8gedfgJN7Z2QSsX|J zD`_#NhD9+QIk8j!M4uEz*g%5pZb)LmGm5+{hXjXL^~vBK26v{=NJ|uALkC{n{*Y;A zg$~gv)U@{2r0alk4fl2zX@iqzHQODORJ9%`YPX}@`WhTL3?<k3Iq$?i9fD(#>=WWb zX(-6p{Lb4d1=hDj@JBk8*sdSoB_8@;WXZqY2}2zSyMqt7b*8W#%lTWEI)Mbr6fr<% zV|G&+5ylgO{N5Z)bN^FRqa0Jd0v!(~;SVrtsFwzh$lnemN%9%MImZbJ{IRUC*Sq41 zc*Pv}R{J6%%IDE6-Je|3V*j-(b8H8(>#|boVL@kS*56%2l9cdnLlMqScVlXtPMwMQ z9NRb%xx-tr=qF`l^2q_`$YgxWSl>!XhX+Jf`cHkAvcn`ZVTCUYBF{pQ2^0LK51SWg z*srXwE5Q>l@1{~Pz4)69%$Kx}LmBOuG1nK-J5fe{b7%9L_C$BE2-|+Qz{A@^m2K)A zs-!#t6eG3dBr%R{6Q380!jGL;K8oRvfO_KW(m)?3r*ZjW!SC=5+z{KA(xRfk<HgjF zso;6)D*Swrc5Oa~PD{N9_v9*yVICcL8af3R8EwnJCjcUBxe7Tn_VDV9TQTa&tyc&S z+N#pV2_2?C(ChV_U?O?7u^=wgg-@<g-uX5A+)n5$TwxlzACZr_`8AZKUu<)RBap>l zYy>n4%RnVNsS>nU%J3kX69x&2d>Q1!n_~>KEg)#PQi($IRN{B&ZG)vHpc7fMtYvd$ z&fNj8^__c~4V4#hf7E#$IQK^wS~eX>QPyw>@PF~NJDri>LX@SxV-xMSw?ej7E#MG@ z%5vaFyhQe7S4QYs!Ekl?$QU-|N4-nVHo4I>rL<{1Pq?gmzc^<RI!MR{f18x<b45gt zg9OD<n`R(=VK>)z2wi)ATyuWTUs;uY%N!=OSY*fmp8jLEY*qO!Ef$qNhxHc&rTboz z@LfmT1XMw&OI&v`qFT+6&wuAQx<PLtKbzts7!|zNcwkzx0dsjny1W1G^+?p&>r<{| za`l8stteVt!LLwX9yU-AP?^2}HKofYNd{P!plpgMwmZffE2{#lCHI8ER?IZWFni3= z43>Uv4g5ufo;M(wB%oZ4w6mW;9lc|5BG;U`bUMc<!%IiJL{QbL|1e-FirsG~$K=oN z@*1i=R3hkab75YOmn!KwFsEDp?eLKnOEN1po%~9m`+y>%%-po6NG!uaN5SCgH-0s| ze?G%G`xnE;ab#!g^bqqmOuYr4{9^TdJN0N3`k;0(iK&7uf-<~>e{2}%AH?%IYES~z zaWbGLI!zjbEkOFR=*6O7nn3*zWNYSrD{)GBwj^Fe>zM_6fo}_j9PR#tA6FQFG@JVO zj&AVWK4$Hc{Ybn+x5UEkn#uiNtCR063x}LZ%kzJ4S@A{E%8>Vxu96auFJkfB`_=He zMA47)_S@&z*vs8qIO{IcA6kT6k?Vp>ndN!O(ZLMdT<+!(>tSZtcv`{~BJYjjDy(F? z!gv;=vE9RyhK%0NEtXriu&7ID+~J${&re{9G@fm13#u<XL(Jm}qxx06%hQkY8%P~C zZo9_wYzc<S!F#DvyLt;x*#h90L*NLQ=~l%<f9Q9Pgp+LF4Ggm-K{*OHj}e&yR`2_C z%iHuH?c7o0ZiFZAEs(d9C`rzetlqDccJrvM4qJxAuHho0?o+S@I0hL$i-&44?h?J| z$$69T*MyKB`C}Yzp-)yU<V*hyC+ksm>H>ZOB>Z>3n8`sMw@6luJ{g4^;R5;qnHr5@ zwb4dwEE^@#5nfDS{lQe&Yb?Gk@}70m7<(NB&8Lo;6!SrJ(b$>BGZX$_V+zD_fpJWe z)21h1Je0ZaIGvS4s_yFs<7TC8B_a^rA_t4q%xKzGLR{V(Dv>_YugG3)h1u522?V%7 z)8{q@EcVw*D>4NqK;~9aj<{5jR5*MsICR4}l*E5NXYX!SzE+Q!`GmeteE+`Cfi17u zc|=~Bz{NBYoz#z0U<8i;W1=KU503qY^#%nE@<Ez5ocp_8+3-IrsiI^@@5$Sn+*JH3 zdvfT!-Awi)9C*R9GFT3q<RV8KNVGdNvilmWK{hSSpd=TKYWAgkA5UwOL3;thDs*8} z@^8e(%;QX1-alW__oTAaY0)h9#iG<B!(ny40AJKG0jYaKh7LHEC8s$&0uz43c?_mh zO1%e41#w6!*JyyHdzXAVYLy1(cG&oGWaWd^2;WCs%9I@J+0uTVeAEJ2ZMLR@zXNP3 z+~T5VsAa|!g3%NGCXXA7@RWjKv`&u19`Oshk4KBxto}s!pI6A~%EfkKa!d2`c1GxV z@Vyah5+vdHnZskm)}%;Z^-)z-jms$ON=Boh^lgp4<0hc?+{`rxi^y+m;4NNC8i;Ai zyRcHdWfwcBtL^MHmuha2yB%@Nx#18igqGc=8E>?--z^PT4_bX#mai7YoZNg1Z5d`x zYC(;rF|!?YG`m{k{Y%2T!-BJGf*6zd7HdOPzPB||nJtX)BjP~aHX(a>-Mis~Pm*w{ z_OXvz;X5W9=Jqm<&rkz!bOUFSbg8pMro;5tE_HD-)lbSl`LxXN;(8W;uzt5U!Bg<0 zEc-p6mp#5p7)LmSC~<w$E^+VoxT635bAO?^id1VnOFgZL6}!OW>;=Kz;%cfdL!eHn z(a*=g)z=XS?iswO>;mrs8{!Z6oh`CGzA}KVkNfCsYaJyp7HtmTew@qRbtAYp5^NMq zMH0=!Z$SIw@px*R2NJ0`DZw#H7M{!f_(LFwlyLBG{x|P!eXLjTzVo`hZ?Olzcb9UK zxbBS+pkVV^jQZj4I)$*nPmRzmu2;$w5xQ_F_y<2{rywRCMRn7?)TH;c13UBirI~5% z$OBs!k8No?OM<5XTi3^aP8SS>NSxT)WR6ZkmJOvBh}#9x$!H#b;!TkYldXe`7T~1~ zlwYqTWTMuJz{R@PBF8o^{MC)5Po^h#*OS(>7CxY%z3#b#r-{e)FADc-6?M&f%>E^5 z#Xo=ej5hUx@cllZF?Z8B(jZWNhod;}MX?<{tvrux3l}1?i|+{u)J&2_l)#2}WniFj z*CPmt7H;=6$l6VH@AWP<-8C}_FADK<#cx@-{fw+!wmN~myf@)L@ypZWS1x7vU&gTy zf=`o#khjliDMp+E7uP9Pfj_v^#-uWvcdqZ8z8D!+8%ikcJ&|DA$QX30Ny>UPJse)` z44v;mq77V)RmxED!7^hk$~<}x^v0RDCSNElk<578uPRGg#lQt_MERFh@%5etCx;qh z@?H;+>YW9FlR=N%ofjAa;GS(n?o4n3qcsTv+ZE_o1H-CzT^6$L><N0m@H%y~N`}vh zwkY`b1EFd&*T;tI9uMS!&59O{ti7|2Z8y5m&IEFtly|83o;8=UdDpF{zK}YSD^Ua3 zR^`{7V|03G$kp&f9^~`%;n}PUWZ0A-gg>dvY~7KgCq_9mqf5Aq;zh`O(r+uHxsn*O z&QaOPt}AUA=NnQ1d%C*Id*`kiYWy`qJ#DMks@*a6V7qR~qBfl!s7%FS#7=?aZRT9{ z_(7wyysPfBJ@Yd>T*s1CK?6!`l;{aI*14aY65UN`ml!!6%Q2hk;tPI)!iL&So$utu zmZBcVO_Q>^YElrUa9&A4xy!J3QzdmzG{`RwPfSuoaLg_{5JKvQ2Bf@lO?z5mv9=M3 z{^cPU#mTOvn=6&S=EL+~en9dK?4xz026T8lASF2)oEb+8%TKPu@(%o}scf*k12&+W zGae><`vhDdgFAAhhil&Z5Kv3%{Z2t|Sl+7JnMoka!D{KFyEpivc&P1CYeyW@v+)+6 zspVAE9ng#=>!xOo=04&3Jv9sXlowLLWzsu{x)esoJOLqUA}q*jGx*J+n*cVf?Y@LL zu0ZZv7ox>qm{Y^gHho7Zr5$N}dy$M)y$Z;s&e~YtT)6l4!+c0B+>KkQ&VU3HqXPe# zxE7C5-@Glc?_)lON^*ZibS3x~*JPTc;R8U#FwkV!iT<fC(&`U`+N1L|-fpK40dO0r z9Xd@vm$2rsdg5r{=LV#;h9JqhpqP|{&+jzye9AnI8+VS+Z+uHmKQ+$!0T@~7cSY0l zDV50ww%rBOY#kx-{YAel+qT=m^5$brG_zmMp~G|)E!En-kC&JCet_8Pu>b&1`|({P zcLO1RfOt`>9AF@;yD|Buv4ncM-6l!g*8T5Rok+jv03za$Jm1kbp@*U@Sej1Tb;Vgl zEfXISQhXkn_6&%AMUOV?ukLy!RT=<^Z1MW&H0T~kEo$pRsyh%~O+SfY3LZ8C!g0c9 zKxC?B;mn_Z|6)wwTAP?s1`zKmd)!qnVF|J%9hU{c)t^`Vm($9LL2}>!sX@<`F;@U> z_>Cf#Q@<<dlMQLA(fzxQx;c=R7n@^l6lbw6WOkN%8!C9a6%PRjAj3x+6EEE<^>!G9 zg@mWgOz?@Wefq1+%-H;1E-Zw<8qgCt*xgp_nfpEl5MCBJFo}KvAhSxedkQwTnebJ# z*<uVUZyWsaonntQn^-3Y!pM$bxx>tlpf=P|_uyoZhxvyZShg>&#DBSz2^#uPfPTs0 z9CZg5*#cA3Uvh$r2(}^=taxl^<cP3F@G8804q#DprZgCU4|&f^rkDmN0{J1V=$QV6 z**;BVKY^5COIxxJAjZ)F%7@F5XYZRwV*L1*JA^jBf4r}Eyp1H(efPcMi{u(U%^>H{ zLG~<*n9Ww=?4g)3L7p_D(EwBJ)Jess_@Q|4@b>S-F^<PE-h<L6TsvU$@MwliiAX&U zs~~`sT@)mdBuwH>5yWUOS6^Q{`)Lg(xHtew2^FZO{hzl(9CO-i3k_@ooJnFQCIVYi zsd6dI+|<#4ns4`~A4M6_IPq00vLT^uL&0~qd$0ud@Y4Ec`r2_(=UYS7&VC<3yAH~( z+GPiQ0OHHCl8A}+W?}oI27qiY^PnbZ=(3n&!8HG9D!370ewL`-U4W`|I?+?cYBV|x zfTIlpX=_~GUNq|UHUS#Q5CGb#2t|A#J%J?|D#)6sZ69vVRD83iaIql-rWs1GTyt@a zeA7;r=e{gEK=P@0Yw>-jKjFWF5oAdkCaH@A{8fRNyuX$KRw<EeKy`F3XT-{61i<Sm zBMG?}lT$hf$neuaF(_*{mB=srTiFfKW_$AmCEQq$Av@Ceu8zYjlEj8vyIAox9d=t> zSCMF}w#`TNiwbmQwO@(*_HnWIAFtPR@8gtuZ#ZKKLi_*R<cme3n8#Dg6<<~+tIsfN z8+J*G(SO)88#dQs>$#K^gvM3_36+_XZ}kQDr{!2+BCpfVR>*)UO79(j25R=1c;)rn zh=F?fz5l-3BH4Tben<-oYviVUc)LObjcPRJ-#=F-&!SiA0#a}>LxkG)ce?VALktbt zmt8%v`AqZl8mF6QNGJVM@2OqWHNQS~=aWJRG}#n8^s4eUaWrfMfgA_~5KXO*)G<(! z2;l9Y3K`s0>gDD{*!_^vHK!@LM0$qT8AGqMiHmWPbX&Si$OzZ{5VIs+2)80{!X!z} zcVx2*LN}dQ`yCTXNjQa>E}AE}JX;7LPk*_#D|oQ113eoSfG-t;HQsgp(ZeKgV!nxG zB=Cv+$&+hF%0H4IrIZdxo+oM>iAnl;i0kP0+X_PDq$Mc7wMNg{E(*_#=u=aou<rGH zlLcsY>?FN<OVBWRSWGsjZaCi=w9w&&6fi;~#cm_*&8dA2C)L{Iddv6v-c6IYhbKK& z5*tqs`0R?%WJTAivZ6Ze@+YugT6Rm*WPUqPqaox6l2CLwH5g5cLl)7NkVx;m?{@2` zx)3DElq!t+;A!{JyI&k(%BtDBq(_jjo9%)eMz^O8y!KxXZq=$R%qK>K!~!f)>(=w8 z<2+LSeKp%@mZ~9`5Y!};`+a7{9YELBgdv!`xw|b`-n(Lnsm{3FbBeb!{_OP11Uwap z<Yj;yJHrP5@nj_O=hO>zVia`Zqwd^M3{;ZMAhg$mze&InBzomlz3*o>wXExAiVvM< zH40smBosTWkbB(riwb8s&7KPdFN<E5cIKTk=nVS>MDqdZlJq|ZJl>+^m?r2ge1T*E z9=n!%-}Blp%WP*BNNgrX`_uadaG1xfIhdu?@2!Evp>t`<8#jS^A;kD>77I_kui$G# z^mAUlVM>b+@P-xu99l|;6}0(k#fU(%x0)rV-7Vnm8)#>1euw>P0aXD-U-L&lWy){t z__NU|oc<k%HK2zkD$aMqQaBb&hd}~S-^NW`^fohEf4xHP{m|;3c~RH%ib;0m)VSGB z2(Z_5ID~7xCotr4;4VQ~zUaQsN{1VedxrqzL1S#`Q6H~TIHOY3Y80v3+gDk4LHSBV zU$Uv8CMudrA_al-ZQ}rPs79}>X-&FTnLYXnSc!td4~}&2bQlf^|2u&!@>^u&II?!+ zSYw`Ww}eDBBI1V(Njqye@3RQq(!h~wKRj0;{Wja#`HHo2*bF(M({P>4P|y6;T$as6 zbPi^qlII>8H(SgVFIPu5+*Ynw2~H5b<k2L_i_2WnN3)Z!Nl%Nmd+>NSvBvd#3LxdH zNH0vGP2{Q$1?G6Z2I9`<4YU-pLr*l85TaaJIkSg}XKJ<fUA)aO^tpZJ-l!Lyjedu2 z9{i}ALq?;7VBSQIcQM)An``?W_{jyOXT3JE>s!_EbT4{XzKX2$68Ck)&D?PDDD0-* zEO6??5L63)bYdn+G^9C9@c}ZSwmSQd7llF$n;t~Sck$i5wYtp#^Gkd31zt%JsHNti z`v$&;$|SFGmkq~CGXds@aRM&KVjhOou1KR7D@{6kVavt{e?vt4&Mg0Bm;e6jo7~d% z`2-x}d%i&|Bk`B?cN$zvTEdFL>>cjTekgJ9a-?ivZjT^LrR1xah*}s4!%GPrq$jRR z)^`5vsWlWzBpHb1PU1YRWE_aW`Ag_hlB_!?yuO65dmY=4;Ad5Bc(#v!p{47-Hf1$% zwp8|F$wPHpqj%?A9*G{e%o@!;=$#C;(R9Big=ikIhxD7A9{QVxe(QSuLukXItX*Z) zu42!)tB_`CeV`hnCrCKTvF{XjCO5K5mMJSuCAprrYo02q7D7(9NMdbPNEbPe3}uUL z*#7Y1T>!fap2O0>!ESg_|DiDcPqLuN79w%%MC|u9!Td>n$SJ9kJcuEBd9j}m8)qWm zpFS4ilm))96OP~BS;UG(Lk=+}8k>;a??qG?BMJB7jXN|M2W1j<QX9p@auNhBTY!Xv zR0%c`t8CXX^ELiJm9=Yy2Dk0Eu$ht3-5%i`y+?Or(8bWY6Uv!1F-(7@?aIh#_F6aY zE~;B%>_?ngq7O(iZG9Nw(1{ed3dT1qm5MLaiRtZqK<qPV&WMQc`ticusvDFAVUqL% z9R@m5kS>`mHn1Loc$a<@dQp2htADOE&!R3xGQOK4X0o%GpG>&=EQy<&M-Vd9XIUlB z8E6)^5Z#PUW@$+{g&h5m;uSB)S!CYA<*Apf<D#LnhR}ij1|v#DP3uv$J6D9)pD=tc zw!jhb1-^Nenje{tmhS=j5E`*w{W$W_FmOaysQ&1tKkB{w-63bI__O8ek?1HJKV$ZC zzt*+D=cu0Mryxl|JqI7()@}yr<E|u-3n3W>c^;|gIN!!LH7hNyHxcxQ*K=*2w=f}` zvW>dE_9qBrMV9+|H;8D|#UgQ;&q~drg&vvk7j5Jzo@Pthvh^K}P7CQm%ctImAS(g! z_AgvN-oH{sks3<L%Z>8()N`7}Y?{QF(3~A8!ANqU?w-v7)th;d3&fYSEb^6`T3N<_ zU|bmVd<i!o#dcPMbCp~AA?J*K)Xl|6astzt&-8V@p;gb+iq7YHgJ!h0XwJ=RAop3E zPWVoaV1#o#yL__lwJOf~(&6hfD95?@D);C=F6|B8NUmr{PZM%PbY)+#A3d14(wic( zn8oA+vBf4~^Vgt&*)`#BAfK(mDa6c^4EtB8m=ol$pcn{L1wQMPlV*{rVws$C0z@<? zKun;664(UUDPL?qElqL>W0SIyNW;+T{7IL}D<!BGUj%}OHxG5P{u^>2ETdArXCgd~ zcT1Q8CDh}z-7^p!_g`!RyzrTa3)D>mJvp)Bw>#Mb*v$5<it*{$_U7(gT7JYYLYmKz z40}s#BiXoRrfee<=?xce$i!lFncw|s<g`JOVHEG-jO1}X?TGnqKlJY6$C+hCyxhF+ zcPCy7EW<7bd4A6y;ImMxNRdl20V6t)4$IZRtW7-Q{WznfHQPI!<Q+om^hy!lNs;$F z{Zrqi)A=n6j{;nN7Z^^fy!LqNx6ECcckPQ=NzZX_>E%c9&-A?Wvl0*Wnh(26^VgXO z&$>!U#MA3D`Fo6<Vfi?a<p!3!&z1!#_&1nWrcOGRvj(t-!6Sf05hHdI;YW$l_BwJD z<B7Ij4}TlH`|Qz=*)hF?Cqb_Rikcjlr1;gx!Kw(_`G{u>iQqTtr)=lm`61SCxlI#K z#2VZ$Ln^e#`<CR$=(E7!7w~$9HtQBz<D^(c!IKgrIGz&whNCKxveJ3gyrnZ^2X|9i z2yuJ#zL{EWW&hH#oZh`RuzI2o8qzZU;lhQz0HP9&z5|s^GsO4Jizgt5Hbr}6TIv?o z7G%iRlY@1eb0YmZVkn6X(fQPvzH<KPbBn%Eb%zd4?Uw~-nDDr4zn3@?Z9kc}eP@R7 zAqxS20e4b)tZZ+jdKBf0?Z{foaYZTn59Jr>4#=K@F~d(61XjeUw)+(0x}=xMoJ3{F zadV718RIs~^+Q5Ltp%#7PZtMF))sqH_6ntSU8<Ej=ih!eiCW$XL$s#un~xP-e9a#R z4w<aUQeWg>)9_76p!h%C{c5lMYsMAR;<9(N@$>j;l47iu|Ef^e*IZd<N5s?M=uJ)~ zDIPNnTBAakLh%1&Kw55C8ebR;)iC|{Gi7mu_4IeghAvwFF8w>+#H*tY8vf7yR8{8w z9<!;y!;~QaCKx7?8UVxGG=WMvP6ov>UKn530|0P@EFYB>frn&Y0We(w(*D1<N8$sb z041{V%P#;-XYLO?Un?wd0K@EX!~h(*Cr4J~KhT~OZu+}lrkSt{0~kk!pYZ7;pb!)w z0nbk%T$aML0||6MJHQEKMS_V6wE(7PrJ0lE49E=~VdUdiBju~Fw=-`Af5!Z$hR{a1 zg9~LNS3u5tF)qb5=+n9-Gb+P>j{>g$(<<4@$w5(kM}cvJ@e1%+0J&^VuB^Z8`Ki~8 z5S!EoC>nrT0q?&&fAW9GJ^)}OY@$zr0gQeyfbl|fA2zDpFtmDp+_)2XXcrmie$x-U zuc0tagcE3fcL?Jvm?pvnt1ZN6jp2o{n3XV1gwsib`9EI)Sj^qvX;{NUqJTlF{4o>& zYZC@A6wd$8AVqvfs%`5UwlV(g>En<#d4N_d7bdfE%UdN{IZ4;4!`El0gJC#BwH}*v z0w4g;18Ay;{9yp~fe@eID?XO*)_$YFNde)c0CdPAXW46o%D;0U&och!hjZid#%)>{ zX~>`u&FUkD@uG>n&Fx}G=(&*}7P*}DkycP`P*O~F5l)T+zI2J#4&T}*ETIRxJw!b| z?1IG6BPW0&)bkKtkK$VW2*lh{OhW6Z?I<K}IV}MG7SAIz0pg5MXnQ=eO@`GDNNxd= z3*-M5<GCZXS1xo0MVF)Z=4}BV(+wVD=_5*HM+G_0sQi;cU{J0;%Z}a~%VZjUmY(k; zI#_Rh4#V=mv+9OX)xbBv#iK9wlJ~+p)WzWjV2TE$vKy0*34p|mg3f_zt^}Ywu-WSO z-;f!3t))JfY@iNjAG=C{%4IJ<ISJ57Y9mR7+Ds(vVDv*Ov%aY1ncy6;G`$0mHm)%) z%1@#teZJ`{c@<_1Lu3+R!p1+sWzApA1%H;cW)Cx@kgAoSNAhV-*VnrPQe<rC=JWoj zC9$JF!i`l7%U)OjV1$NX999y5ZBEM4&<xU2{#()Lk#L@p!YAG*o<o3ZzGlg{;Z0g? zE~9^*7c#;#*bLBkDq~hx3#Jvu^epbi0LiGo0Hjh&D7eK}UG#-<mHQW+Q;m~~dMfYs zOVsKgW*gd6V8CScN!z_@BY+R-rdro8&?<==V+mX+s=P$|p3DAKBnSrZr8<uC4AGX9 zeueRmmvQpS(zn5|0#QcNWOajZTFQ<5KRjGX>9qeqKp0EGstZ(+IsmMm+H7*DBoBZT zs0u)kYMp9c0=1N)wLd^x*|1F%2Djt4!k+mSQ)Hf>@DJ7@lb}xoN>}fp<N5GBeYt)g zcR-)ZL0N+;&5LKUhL2O<OcbdK$dJSa>^FN8fwmR^I5rXl0HS<91jEQy`t}E?aklqW zQIN>M+S647q;V&U?)gIDd0I<#8CH&Xrw=+Xk(q??I>!D;?|_m<cB0M<V21zI8^X#T zD++^Wklgz#v)TaKkq&PE^)uG<DOTbz4Bd5r4$!D2<JH7-{OJ3<V&6x6fHw*Tz{xK$ zVHmOY{;--WY6+ll2f+EsI#v-mnb^^WZ~uXqfF`I)*iiiaA=>Bg7!WWSNbl$S1|<ls zzh&kEs#5*pGw?PwH?!=gi$XdS^z@!$lPDp?r~~rqWL=-erg&I2=m*B(1@!W&QsG+| z5XyJ}^X#i({sd$X2CNK3OBQzGV85-dNv>P-xu5AhD~1awdV$(e_Iu-dVnUL(!vF<X zP7JgGY}VT*-|JYgS00gl4~}ueic878!PR8|S?nrc2q4u!gq)~l)0n@l1@JE=K60+y z7ypilmMFOUW<Uiknd=$Q?^Xp})#vE|+YSO0x-xklH=3r7Z}P7P0>+`l!-O0udmgH! znhL85SuFIfV)FX?YG(F+$@iJgIi!}Hhyh;3MwtnpBkV&D`z8*;*bz_z<+=c1yv1Gp zV`;7%J>jiJg{2N#AOMkdE^7r;85OlSy6+Fz8BLG7oh7112+8r5gvY;}E@RM8NizG` ze%H6uVtK8<a3+uzB76oUO{>PIy8}<tL|XP|7%{GeIKKfKU4ukNKzCD1Zv|Ayl1Dp( z`AR~6Kn)RFu}SlNx}`&@U3Ir|K=CwgFse~2Vc(klgl@sJpvf&2qUR|ah$aOCN=sIk zV70oSS?5BWK&^Kacs*37&@GrYbHI_5^iF2+{la-DCa^Hfbf{N>4VZ{-&53~4%oh@h z$C}^`7^vboWFr!a1z|Ct<+)jppKU<qC%j_`m8=*hN*G5l)bF;w9-v+Tvx7x}MQ$=v z@1}2MN48|KXg+_u#Bn7+_%0mBu!dO6V8G=Ic@uRrtr&TOlDnaj1c`VUcR<I_j0gMj zmhl#sW1hD%Un5(AA`Dfvq-Ki~%bc7R!dLt)aF&_QvwN+dm=$kj6@W9koflVbtk}Ho zutjbkVGR!MRU_<g0n9{LES^fObA7~BHvibAC8C!U0xKT;z=Cc`(3g(8CGs+>6f2lx zQgb2eE$(Y}&Pl@)`i%jx7|uha%OM$?*LkoyT4&oMOWk|T)=sjDyL1sA<A68Bu_U+> zIW|~a&hTC_R?71KDj{?c0|+-hqIgzgjf&`Xm*?N}Tpuu1YLsyGRo=_r@-eZm(Te!x zXBJ)xFq|C!q}g`=29uyGs!4oLe+8gS)8hb2scy15p)!7z6|kQF#3`gfGJFLpnLgXl z!SzD~PTUn5p@Vb>fp(~qi%TH_?ib(v@U5@nT}L?P5@6u;wQd}CQY*9HqTj_bp~l4u zP&<CGG6sxXc^qBq44x~um=6hzcNai7j9KY1R3^!UawFYuhpB&AJQsukQ!5LlLPxbz zv?6uMH*@M>EySHlHJ9a2=)2(>+vLE~+VL$XbR_vK%!oQn@(zq70;~7CJYI#B$nLMq z`vE)lh)$%4s027)(~K)xuZmsi_<sz&uJ*T;vu0}}_-HLg$_*RPlH?EVJJT_$m5u3$ zSGBMz_Pcpxtf4q;eYC9<jC$Y<Z~zdMH$f0iMgc)U1)TM+$&KbMwt3R(rsPN5Nm*5| zk%aQ&>_)()U-bB)tW#Fz0^)wY7XSv9Yx~bX>|mkvf43^Dn=J;b1aXC+^6>mk32Wfp zh=ggOGvz|(sbkaWHb+(t1z95}K99UIqF>Nxe>xrNaxBEs{24m)D>2SNS*OQwx9?{} z=!zc;$zGob*$(m9a-@o%ylQpRAo+31oB`$MsNNOtn~%BfDCWK$K#C;Qakm_d+hh!P z^GlUpCW^^kU7WYlQZD5Gw>~L4B<3~vw9v9p4Gg+l*sk`DDftpY8+tqSyR8;E(v9vn zuyeSd&8L=KEw4KLsAjddKm9^zcM$;zMSbTNAscysif?XNqKIxKGdYE|C`qzmZG3k+ zE4vKI2m|x#NNOgy4#WJr7nIob3u*Bf!NkE)JRwn^=7y&{<gy<0=Z^R*e>n={MnwL1 zSq>o%zMWw^VWNB{;3AXZpaQNSLioR3oFWdmh_WtPw3)#B06$orEEeWs;>W|B-2oe! zd|(lg0bcYgDk#joG{gm5U6uvwA}7G3Mg*Kle{t9{)02gj`cXGCB*IG301ucxrXS|0 zM@j=<>NRS}p9H){Y~Ynhxc^$j5-zM3m-1|Oa<O)%Ob9X8xSqDr8dN|mkVHiG`ee`| zPYFt#Kom)vGmiYG80w1Y&R3F*>%p=pHF%<+aOozJt03$C7>Y;J+Z=UAM<ch;K?6Et zQ%wD59AZUsa%p;*ThY&8=_Fg5i%F4Q24?k>5kW|T^7pxsCX(<Rc_yWcmj`Z4*HZn& zk?78zJn3qBo@Fk+CrlQD%A;zDy9bmx<!ms2c$a*f>Hd_q1!E>u#O>qi^q|yZODM>z z`FetqqrLNet=9<aS?{bL`Q+vz%ZBDb*iGl`+OR@-)1#&sn{JK#<qcx9+6je_ZMIcG z{8W*ZC9ykfpv5F}D(dR{_3}WHN6wQiZ%+E6jj6^;%`5Gr=iTgq)Qy&Rrqek_G{Xj+ z`<YS8chx7CEyL74wx5!D=kspzAbUcRpOim8$Yg?yt)=J9!zER>ur_e#(8~v)RR|sy zxpV463gu9K=AFsbay636mrg(1PY}4(W~<`mN1D$00e2o*LQfdi&}ubxEXLc&5S9|z z8mCRGV!MFVoOn>7zYo7Dt_O!Od$6YYvuG9Ek@>kUvw4y32_uMv4c>N?xjNlXHn=*K z$Ot6a2`Y-xRJX3JT~kAxj~*Y}>Nn=Uyx+gF2Mrmo7FeFFCXY4dkbsiLx^4})DR8-L zmVe(>DW2@LSMCh;wL$ZSfxqkU)pxNJWG(#AqVDMprJp+&d6V6g4)}2Q>k~cHW3Uxw zhbnvQ;`A{P8@~X{g85s>@_V;0{oBCb&L|bH9iUGCCiYp8YuQdLo7Lz>-A{psoH(0T z7pMp*p$UXbhv$Kor`><!X8~c^(i`2HF%nx3maOr_p<(^kv{IDB?_C77w!eQ7=*~}^ zv~rz7fP1OJ&eZ9#+v;|*UIew8rd|-7=YL&svqH7}<F6Y9t$v<32yCZCpRdjB6wf}{ zdBq5nP);ZqEKol-L3gIauKxRRz`4<>1+(Ji9wz>{Cd2$SRA_$jW|J6T^W^n2d!gcY zeaRKcPn4MF@%iThcQdS<$F<1<*sibsoVjdI-PsF0#qTy3P1^{n<^Qgkz30T~xqfou zdl%)g9PWO+^I~_qdpt|YB~SIQ&zxtSdJA+(siem<qtiOUp1dEGoQ`z=i22Mhad}al zP56xo{Wn<Ne$71xnxiUT87utBADAh5xEmQgdqRFkdz@D02hJH*sq)+}&td!R1Uw!g znn?+`>p}kDoGZoblf$0``#$uwG|FIUQII{V`MO4<QT&PX>=T?bmDG)r)}IREvpl7) zU|hOe?)qkvEj>>!D#{qma-8$+_X@r9THkJO36)%UQ_bk_lI+c&Jm%Qdo$@X|lOJt1 z@!V&ZgbEIxt|J|3D^8?=c67@x15VnOYCm+@ns}kdjA?OcuZe)8affq>$Kpt}JxkN> zl|4^!caU;anbvad<VV@v;7vs7t7A&r>lBxp^6#z4nbvZtBI{QFg{aSMJr<V~IePsB zC+x4?`=c!V2ymeeu=m;yoYC*Os3hZUe{Tlw>t~ZDg)7?b(UueKKfG^xaa_dZ4^Ov# zJb$CoYhA0FrR(Ggo&rvDloxV5nXKBc-=ZwNL~7HOhvJSkPr|o5<UJ{WJICg9y7aGo zX=i3{F4^Le+oqwuzifrJom|$*%+8a_qWbzWi)?)@!7XcN_k>SdFEc!qoVUAukKk{g zhqayCALibF4xCKa5?1$HbJ|+^#<wmVL&=Rbf)cxJ%~(=)KAmY?&Hy?`$g9qg=aaHW z>D{W=YfE=l0Q+;-mdZZrG^qRY!%JX~%IR?FPw#3b-JT-)^W|yjqQ!^qy7o_4A)V-2 zSNaJ!y!uZugXP+p<_R`tiYv|sh3zW)$n^5zGd7t=H?2xpGu!RJCGkT=gVVqb7Zm}! z7x7FNykGPA?ALX3dEZn_xO~^*$$<^IY0+{w!yo1DoGgAMq5jmdAHZ3qSC`hk?6jOd z|KRE4n?EbJA77*wCz>ptZY*<BQ6}yN=rn<ph5$j8Mb0wQ>R**#Zg}UBvUF<LtIa8{ zHn+q}CwHd^DnE(>ZY$G1`BCj{Yi9lxUv;Y!&i<#v-hTUhpY7I`LtNTZK*u3H3-;Ti ztQ6M1v{Jagtad^nunI9SVES9fI4989=h(T~T<6&jDhjY1{N1&5QOW7!70bMAgf?%< zs!CiaX34?rd4pws`Mt{5lX|BgKTzrY>Bq;E7fl8)lr9`J1~v>oDT_=0dGyv<F`DJ} zyO}yhQx~rObwc*KbI+IUEKAITrnILY=jQ&a<EX2x%pbW&hh^28<9a%_i}~)&v`T0w zX#R5Y9H{;cZgbeL;%1VR)YGv>QfXeI87J4oABF)>Cxp}=)9U{tc%myiRhgx6m)d#% znALyM_8q)(|BQU;_HE?`l`q!BwD|4v4)?F0(b5C1i4Sn_cqB1*pO69i6F6FB&2q1- zaoJqH$YLOG$PDG6>^DUjmD(R~owaY}7U?Oz;N7Ul+!oxGp7>w>Ez_E~i4Pr3fv0;h Nc)I$ztaD0e0ssLaIST*) literal 0 HcmV?d00001 diff --git a/doc/workflow/time_tracking.md b/doc/workflow/time_tracking.md new file mode 100644 index 00000000000..3b3103110d3 --- /dev/null +++ b/doc/workflow/time_tracking.md @@ -0,0 +1,76 @@ +# Time Tracking + +> Introduced in GitLab 8.14. + +Time Tracking lets teams stack their project estimates against their time spent. + +Other interesting links: + +- [Time Tracking landing page on about.gitlab.com][landing] + +## Overview + +Time Tracking lets you: +* record the time spent working on an issue or a merge request, +* add an estimate of the amount of time needed to complete an issue or a merge +request. + +You don't have to indicate an estimate to enter the time spent, and vice versa. + +Data about time tracking is shown on the issue/merge request sidebar, as shown +below. + + + +## How to enter data + +Time Tracking uses two [slash commands] that GitLab introduced with this new +feature: `/spend` and `/estimate`. + +Slash commands can be used in the body of an issue or a merge request, but also +in a comment in both an issue or a merge request. + +Below is an example of how you can use those new slash commands inside a comment. + + + +Adding time entries (time spent or estimates) is limited to project members. + +### Estimates + +To enter an estimate, write `/estimate`, followed by the time. For example, if +you need to enter an estimate of 3 days, 5 hours and 10 minutes, you would write +`/estimate 3d 5h 10m`. + +Every time you enter a new time estimate, any previous time estimates will be +overridden by this new value. There should only be one valid estimate in an +issue or a merge request. + +To remove an estimation entirely, use `/remove_estimation`. + +### Time spent + +To enter a time spent, use `/spend 3d 5h 10m`. + +Every new time spent entry will be added to the current total time spent for the +issue or the merge request. + +You can remove time by entering a negative amount: `/spend -3d` will remove 3 +days from the total time spent. You can't go below 0 minutes of time spent, +so GitLab will automatically reset the time spent if you remove a larger amount +of time compared to the time that was entered already. + +To remove all the time spent at once, use `/remove_time_spent`. + +## Configuration + +The following time units are available: +* weeks (w) +* days (d) +* hours (h) +* minutes (m) + +Default conversion rates are 1w = 5d and 1d = 8h. + +[landing]: https://about.gitlab.com/features/time-tracking +[slash-commands]: ../user/project/slash_commands.md diff --git a/lib/gitlab/import_export/import_export.yml b/lib/gitlab/import_export/import_export.yml index e6ecd118609..08ad3274b38 100644 --- a/lib/gitlab/import_export/import_export.yml +++ b/lib/gitlab/import_export/import_export.yml @@ -6,6 +6,7 @@ project_tree: - :events - issues: - :events + - :timelogs - notes: - :author - :events @@ -27,6 +28,7 @@ project_tree: - :events - :merge_request_diff - :events + - :timelogs - label_links: - label: :priorities diff --git a/lib/gitlab/time_tracking_formatter.rb b/lib/gitlab/time_tracking_formatter.rb new file mode 100644 index 00000000000..d09063c6c8f --- /dev/null +++ b/lib/gitlab/time_tracking_formatter.rb @@ -0,0 +1,30 @@ +module Gitlab + module TimeTrackingFormatter + extend self + + def parse(string) + with_custom_config do + ChronicDuration.parse(string, default_unit: 'hours') rescue nil + end + end + + def output(seconds) + with_custom_config do + ChronicDuration.output(seconds, format: :short, limit_to_hours: false, weeks: true) rescue nil + end + end + + def with_custom_config + # We may want to configure it through project settings in a future version. + ChronicDuration.hours_per_day = 8 + ChronicDuration.days_per_week = 5 + + result = yield + + ChronicDuration.hours_per_day = 24 + ChronicDuration.days_per_week = 7 + + result + end + end +end diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb index e2321f2034b..b5987a83df0 100644 --- a/spec/controllers/projects/issues_controller_spec.rb +++ b/spec/controllers/projects/issues_controller_spec.rb @@ -326,6 +326,20 @@ describe Projects::IssuesController do end describe 'POST #create' do + def post_new_issue(attrs = {}) + sign_in(user) + project = create(:empty_project, :public) + project.team << [user, :developer] + + post :create, { + namespace_id: project.namespace.to_param, + project_id: project.to_param, + issue: { title: 'Title', description: 'Description' }.merge(attrs) + } + + project.issues.first + end + context 'resolving discussions in MergeRequest' do let(:discussion) { Discussion.for_diff_notes([create(:diff_note_on_merge_request)]).first } let(:merge_request) { discussion.noteable } @@ -369,13 +383,7 @@ describe Projects::IssuesController do end def post_spam_issue - sign_in(user) - spam_project = create(:empty_project, :public) - post :create, { - namespace_id: spam_project.namespace.to_param, - project_id: spam_project.to_param, - issue: { title: 'Spam Title', description: 'Spam lives here' } - } + post_new_issue(title: 'Spam Title', description: 'Spam lives here') end it 'rejects an issue recognized as spam' do @@ -396,18 +404,26 @@ describe Projects::IssuesController do request.env['action_dispatch.remote_ip'] = '127.0.0.1' end - def post_new_issue + it 'creates a user agent detail' do + expect{ post_new_issue }.to change(UserAgentDetail, :count).by(1) + end + end + + context 'when description has slash commands' do + before do sign_in(user) - project = create(:empty_project, :public) - post :create, { - namespace_id: project.namespace.to_param, - project_id: project.to_param, - issue: { title: 'Title', description: 'Description' } - } end - it 'creates a user agent detail' do - expect{ post_new_issue }.to change(UserAgentDetail, :count).by(1) + it 'can add spent time' do + issue = post_new_issue(description: '/spend 1h') + + expect(issue.total_time_spent).to eq(3600) + end + + it 'can set the time estimate' do + issue = post_new_issue(description: '/estimate 2h') + + expect(issue.time_estimate).to eq(7200) end end end diff --git a/spec/factories/timelogs.rb b/spec/factories/timelogs.rb new file mode 100644 index 00000000000..12fc4ec4486 --- /dev/null +++ b/spec/factories/timelogs.rb @@ -0,0 +1,9 @@ +# Read about factories at https://github.com/thoughtbot/factory_girl + +FactoryGirl.define do + factory :timelog do + time_spent 3600 + user + association :trackable, factory: :issue + end +end diff --git a/spec/features/issues/user_uses_slash_commands_spec.rb b/spec/features/issues/user_uses_slash_commands_spec.rb index f2d4aadf540..0a9cd11ad6e 100644 --- a/spec/features/issues/user_uses_slash_commands_spec.rb +++ b/spec/features/issues/user_uses_slash_commands_spec.rb @@ -126,6 +126,32 @@ feature 'Issues > User uses slash commands', feature: true, js: true do end end + describe 'Issuable time tracking' do + let(:issue) { create(:issue, project: project) } + + before do + project.team << [user, :developer] + end + + context 'Issue' do + before do + visit namespace_project_issue_path(project.namespace, project, issue) + end + + it_behaves_like 'issuable time tracker' + end + + context 'Merge Request' do + let(:merge_request) { create(:merge_request, source_project: project) } + + before do + visit namespace_project_merge_request_path(project.namespace, project, merge_request) + end + + it_behaves_like 'issuable time tracker' + end + end + describe 'toggling the WIP prefix from the title from note' do let(:issue) { create(:issue, project: project) } diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml index ceed9c942c1..7fb6829f582 100644 --- a/spec/lib/gitlab/import_export/all_models.yml +++ b/spec/lib/gitlab/import_export/all_models.yml @@ -15,6 +15,7 @@ issues: - events - merge_requests_closing_issues - metrics +- timelogs events: - author - project @@ -77,6 +78,7 @@ merge_requests: - events - merge_requests_closing_issues - metrics +- timelogs merge_request_diff: - merge_request pipelines: @@ -198,3 +200,6 @@ award_emoji: - user priorities: - label +timelogs: +- trackable +- user diff --git a/spec/lib/gitlab/import_export/safe_model_attributes.yml b/spec/lib/gitlab/import_export/safe_model_attributes.yml index d88a141b458..493bc2db21a 100644 --- a/spec/lib/gitlab/import_export/safe_model_attributes.yml +++ b/spec/lib/gitlab/import_export/safe_model_attributes.yml @@ -20,6 +20,7 @@ Issue: - lock_version - milestone_id - weight +- time_estimate Event: - id - target_type @@ -150,6 +151,7 @@ MergeRequest: - milestone_id - approvals_before_merge - rebase_commit_sha +- time_estimate MergeRequestDiff: - id - state @@ -344,3 +346,11 @@ LabelPriority: - priority - created_at - updated_at +Timelog: +- id +- time_spent +- trackable_id +- trackable_type +- user_id +- created_at +- updated_at diff --git a/spec/models/concerns/issuable_spec.rb b/spec/models/concerns/issuable_spec.rb index 1078c959419..344906c581b 100644 --- a/spec/models/concerns/issuable_spec.rb +++ b/spec/models/concerns/issuable_spec.rb @@ -408,4 +408,42 @@ describe Issue, "Issuable" do expect(issue.assignee_or_author?(user)).to eq(false) end end + + describe '#spend_time' do + let(:user) { create(:user) } + let(:issue) { create(:issue) } + + def spend_time(seconds) + issue.spend_time(seconds, user) + issue.save! + end + + context 'adding time' do + it 'should update the total time spent' do + spend_time(1800) + + expect(issue.total_time_spent).to eq(1800) + end + end + + context 'substracting time' do + before do + spend_time(1800) + end + + it 'should update the total time spent' do + spend_time(-900) + + expect(issue.total_time_spent).to eq(900) + end + + context 'when time to substract exceeds the total time spent' do + it 'should not alter the total time spent' do + spend_time(-3600) + + expect(issue.total_time_spent).to eq(1800) + end + end + end + end end diff --git a/spec/models/timelog_spec.rb b/spec/models/timelog_spec.rb new file mode 100644 index 00000000000..f08935b6425 --- /dev/null +++ b/spec/models/timelog_spec.rb @@ -0,0 +1,10 @@ +require 'rails_helper' + +RSpec.describe Timelog, type: :model do + subject { build(:timelog) } + + it { is_expected.to be_valid } + + it { is_expected.to validate_presence_of(:time_spent) } + it { is_expected.to validate_presence_of(:user) } +end diff --git a/spec/services/notes/slash_commands_service_spec.rb b/spec/services/notes/slash_commands_service_spec.rb index 960b5cd5e6f..1a64c8bbf00 100644 --- a/spec/services/notes/slash_commands_service_spec.rb +++ b/spec/services/notes/slash_commands_service_spec.rb @@ -86,6 +86,18 @@ describe Notes::SlashCommandsService, services: true do expect(note.noteable).to be_open end end + + describe '/spend' do + let(:note_text) { '/spend 1h' } + + it 'updates the spent time on the noteable' do + content, command_params = service.extract_commands(note) + service.execute(command_params, note) + + expect(content).to eq '' + expect(note.noteable.time_spent).to eq(3600) + end + end end describe 'note with command & text' do diff --git a/spec/services/slash_commands/interpret_service_spec.rb b/spec/services/slash_commands/interpret_service_spec.rb index becf627a4f5..e1358acd7c1 100644 --- a/spec/services/slash_commands/interpret_service_spec.rb +++ b/spec/services/slash_commands/interpret_service_spec.rb @@ -210,6 +210,46 @@ describe SlashCommands::InterpretService, services: true do end end + shared_examples 'estimate command' do + it 'populates time_estimate: 3600 if content contains /estimate 1h' do + _, updates = service.execute(content, issuable) + + expect(updates).to eq(time_estimate: 3600) + end + end + + shared_examples 'spend command' do + it 'populates spend_time: 3600 if content contains /spend 1h' do + _, updates = service.execute(content, issuable) + + expect(updates).to eq(spend_time: 3600) + end + end + + shared_examples 'spend command with negative time' do + it 'populates spend_time: -1800 if content contains /spend -30m' do + _, updates = service.execute(content, issuable) + + expect(updates).to eq(spend_time: -1800) + end + end + + shared_examples 'remove_estimate command' do + it 'populates time_estimate: 0 if content contains /remove_estimate' do + _, updates = service.execute(content, issuable) + + expect(updates).to eq(time_estimate: 0) + end + end + + shared_examples 'remove_time_spent command' do + it 'populates spend_time: :reset if content contains /remove_time_spent' do + _, updates = service.execute(content, issuable) + + expect(updates).to eq(spend_time: :reset) + end + end + shared_examples 'empty command' do it 'populates {} if content contains an unsupported command' do _, updates = service.execute(content, issuable) @@ -451,6 +491,51 @@ describe SlashCommands::InterpretService, services: true do let(:issuable) { merge_request } end + it_behaves_like 'estimate command' do + let(:content) { '/estimate 1h' } + let(:issuable) { issue } + end + + it_behaves_like 'empty command' do + let(:content) { '/estimate' } + let(:issuable) { issue } + end + + it_behaves_like 'empty command' do + let(:content) { '/estimate abc' } + let(:issuable) { issue } + end + + it_behaves_like 'spend command' do + let(:content) { '/spend 1h' } + let(:issuable) { issue } + end + + it_behaves_like 'spend command with negative time' do + let(:content) { '/spend -30m' } + let(:issuable) { issue } + end + + it_behaves_like 'empty command' do + let(:content) { '/spend' } + let(:issuable) { issue } + end + + it_behaves_like 'empty command' do + let(:content) { '/spend abc' } + let(:issuable) { issue } + end + + it_behaves_like 'remove_estimate command' do + let(:content) { '/remove_estimate' } + let(:issuable) { issue } + end + + it_behaves_like 'remove_time_spent command' do + let(:content) { '/remove_time_spent' } + let(:issuable) { issue } + end + context 'when current_user cannot :admin_issue' do let(:visitor) { create(:user) } let(:issue) { create(:issue, project: project, author: visitor) } diff --git a/spec/services/system_note_service_spec.rb b/spec/services/system_note_service_spec.rb index 0e8adb68721..e85545f46dc 100644 --- a/spec/services/system_note_service_spec.rb +++ b/spec/services/system_note_service_spec.rb @@ -740,4 +740,69 @@ describe SystemNoteService, services: true do expect(note.note).to include(issue.to_reference) end end + + describe '.change_time_estimate' do + subject { described_class.change_time_estimate(noteable, project, author) } + + it_behaves_like 'a system note' + + context 'with a time estimate' do + it 'sets the note text' do + noteable.update_attribute(:time_estimate, 277200) + + expect(subject.note).to eq "Changed time estimate of this issue to 1w 4d 5h" + end + end + + context 'without a time estimate' do + it 'sets the note text' do + expect(subject.note).to eq "Removed time estimate on this issue" + end + end + end + + describe '.change_time_spent' do + # We need a custom noteable in order to the shared examples to be green. + let(:noteable) do + mr = create(:merge_request, source_project: project) + mr.spend_time(1, author) + mr.save! + mr + end + + subject do + described_class.change_time_spent(noteable, project, author) + end + + it_behaves_like 'a system note' + + context 'when time was added' do + it 'sets the note text' do + spend_time!(277200) + + expect(subject.note).to eq "Added 1w 4d 5h of time spent on this merge request" + end + end + + context 'when time was subtracted' do + it 'sets the note text' do + spend_time!(-277200) + + expect(subject.note).to eq "Subtracted 1w 4d 5h of time spent on this merge request" + end + end + + context 'when time was removed' do + it 'sets the note text' do + spend_time!(:reset) + + expect(subject.note).to eq "Removed time spent on this merge request" + end + end + + def spend_time!(seconds) + noteable.spend_time(seconds, author) + noteable.save! + end + end end -- GitLab