pageflow 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of pageflow might be problematic. Click here for more details.
- checksums.yaml +13 -5
- data/admins/pageflow/accounts.rb +75 -0
- data/admins/pageflow/entry.rb +112 -0
- data/admins/pageflow/folder.rb +59 -0
- data/admins/pageflow/membership.rb +21 -0
- data/admins/pageflow/revisions.rb +33 -0
- data/admins/pageflow/user.rb +184 -0
- data/lib/pageflow/version.rb +1 -1
- data/vendor/assets/javascripts/audio5.min.js +957 -0
- data/vendor/assets/javascripts/cocktail.js +87 -0
- data/vendor/assets/javascripts/html5shiv-printshiv.js +500 -0
- data/vendor/assets/javascripts/iscroll.js +1811 -0
- data/vendor/assets/javascripts/jquery.backgroundSize.js +314 -0
- data/vendor/assets/javascripts/jquery.fullscreen.js +158 -0
- data/vendor/assets/javascripts/jquery.placeholder.js +175 -0
- data/vendor/assets/javascripts/jquery.simulate-events.js +312 -0
- data/vendor/assets/javascripts/polyfills/bind.js +21 -0
- data/vendor/assets/javascripts/polyfills/get_computed_style.js +16 -0
- metadata +85 -69
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MWY2OTg0YTEzY2RiZmZmYWE2MDZlNmI3YjYwMmMxYWJkYjBmZTVhNA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NGM3ZWNkYjIyN2RjNTY4MjE4MDE5YjRlYjZjZmQ5YTc2NmI3MjViZA==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YmVjM2UwN2U0ZDZlZWM4OTdhN2VjZjBkY2QxNDI3MTkzNDg4ZDE3NTRhZDdm
|
10
|
+
YjA1NDM5YTI2YzQwOGU0ODljMjEwMDc2M2UyODQzYjVjYzdjNGQ5YWVmZDhm
|
11
|
+
OTg5ODFiZmI1NjBiYzM0YTQ1M2Q2ZDFiYjA4ZGMxYzZjYzI4ZjQ=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ZTU0ZDI4MjBmYmEyODQyZDliNzliNTM4ZDc5ZDBhODFmMjJkNjNjZWEyZTU1
|
14
|
+
OTE4NTIxNzRhODA0YTBkYTg1Y2FkZjM3NjdlNTI1NTMzMGVhNWExYzFjNDll
|
15
|
+
OThjYjhkNmIwMDA3M2ZjODEwYWQ5OGU4ZDk1MjkyOThkZWI2ZjA=
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module Pageflow
|
2
|
+
ActiveAdmin.register Account, :as => 'Account' do
|
3
|
+
menu :priority => 3
|
4
|
+
|
5
|
+
config.batch_actions = false
|
6
|
+
config.clear_sidebar_sections!
|
7
|
+
|
8
|
+
index do
|
9
|
+
column :name do |account|
|
10
|
+
link_to account.name, admin_account_path(account)
|
11
|
+
end
|
12
|
+
column :cname
|
13
|
+
end
|
14
|
+
|
15
|
+
form do |f|
|
16
|
+
f.inputs do
|
17
|
+
f.input :name
|
18
|
+
f.input :default_file_rights
|
19
|
+
f.input :cname, :hint => I18n.t('admin.accounts.cname_hint')
|
20
|
+
f.input :default_theme, :include_blank => false
|
21
|
+
end
|
22
|
+
f.actions
|
23
|
+
end
|
24
|
+
|
25
|
+
show :title => :name do |account|
|
26
|
+
attributes_table_for account do
|
27
|
+
row :name, :class => 'name'
|
28
|
+
row :default_file_rights, :class => 'default_file_rights'
|
29
|
+
row :cname, :class => 'cname'
|
30
|
+
row :default_theme, :class => 'default_theme'
|
31
|
+
row :created_at
|
32
|
+
end
|
33
|
+
|
34
|
+
div :class => 'columns' do
|
35
|
+
panel I18n.t('activerecord.models.user.other') do
|
36
|
+
if account.users.any?
|
37
|
+
table_for account.users, :i18n => User do
|
38
|
+
column :full_name do |user|
|
39
|
+
link_to user.full_name, admin_user_path(user)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
else
|
43
|
+
div :class => "blank_slate_container" do
|
44
|
+
span :class => "blank_slate" do
|
45
|
+
I18n.t('admin.accounts.no_members')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
panel t('activerecord.models.entry.other') do
|
52
|
+
if account.entries.any?
|
53
|
+
table_for account.entries, :i18n => Entry do
|
54
|
+
column :title do |entry|
|
55
|
+
link_to(entry.title, admin_entry_path(entry))
|
56
|
+
end
|
57
|
+
end
|
58
|
+
else
|
59
|
+
div :class => "blank_slate_container" do
|
60
|
+
span :class => "blank_slate" do
|
61
|
+
I18n.t('admin.accounts.no_entries')
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
controller do
|
70
|
+
def permitted_params
|
71
|
+
params.permit(:account => [:name, :default_file_rights, :cname, :default_theme_id])
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module Pageflow
|
2
|
+
ActiveAdmin.register Entry, :as => 'Entry' do
|
3
|
+
menu :priority => 1
|
4
|
+
|
5
|
+
config.batch_actions = false
|
6
|
+
config.clear_sidebar_sections!
|
7
|
+
|
8
|
+
index do
|
9
|
+
column :title, :sortable => 'title' do |entry|
|
10
|
+
link_to entry.title, admin_entry_path(entry)
|
11
|
+
end
|
12
|
+
column I18n.t('admin.entries.members'), :class => 'members' do |entry|
|
13
|
+
entry_user_badge_list(entry)
|
14
|
+
end
|
15
|
+
if authorized?(:read, Account)
|
16
|
+
column :account, :sortable => 'account_id' do |entry|
|
17
|
+
link_to(entry.account.name, admin_account_path(entry.account), :data => {:id => entry.account.id})
|
18
|
+
end
|
19
|
+
end
|
20
|
+
column :created_at
|
21
|
+
column :updated_at
|
22
|
+
column :class => 'buttons' do |entry|
|
23
|
+
if authorized?(:edit, Entry)
|
24
|
+
span(link_to(I18n.t("admin.entries.editor"), pageflow.edit_entry_path(entry), :class => 'button'))
|
25
|
+
end
|
26
|
+
if entry.published?
|
27
|
+
span(link_to(I18n.t("admin.entries.show_public"), pageflow.entry_path(entry), :class => 'button'))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
sidebar :folders, :only => :index do
|
33
|
+
text_node(link_to(I18n.t('admin.entries.add_folder'), new_admin_folder_path, :class => 'new'))
|
34
|
+
grouped_folder_list(Folder.accessible_by(Ability.new(current_user), :read),
|
35
|
+
:class => authorized?(:manage, Folder) ? 'editable' : nil,
|
36
|
+
:active_id => params[:folder_id],
|
37
|
+
:grouped_by_accounts => authorized?(:read, Account))
|
38
|
+
end
|
39
|
+
|
40
|
+
form do |f|
|
41
|
+
f.inputs do
|
42
|
+
f.input :title, :hint => I18n.t('admin.entries.title_hint')
|
43
|
+
if authorized?(:read, Account)
|
44
|
+
f.input :account, :include_blank => false
|
45
|
+
|
46
|
+
unless f.object.new_record?
|
47
|
+
f.input :theme, :include_blank => false
|
48
|
+
end
|
49
|
+
end
|
50
|
+
if authorized?(:manage, Folder)
|
51
|
+
f.input :folder, :collection => collection_for_folders(f.object.account), :include_blank => true
|
52
|
+
end
|
53
|
+
end
|
54
|
+
f.actions
|
55
|
+
end
|
56
|
+
|
57
|
+
action_item :only => :show do
|
58
|
+
if authorized?(:publish, Entry) && entry.published?
|
59
|
+
button_to(I18n.t("admin.entries.depublish"),
|
60
|
+
pageflow.current_entry_revisions_path(entry),
|
61
|
+
:method => :delete,
|
62
|
+
:data => {:rel => 'depublish', :confirm => I18n.t('admin.entries.confirm_depublish')})
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
member_action :snapshot, :method => :post do
|
67
|
+
entry = Entry.find(params[:id])
|
68
|
+
authorize!(:snapshot, entry)
|
69
|
+
entry.snapshot(:creator => current_user, :type => 'user')
|
70
|
+
redirect_to(admin_entry_path(entry))
|
71
|
+
end
|
72
|
+
|
73
|
+
show :title => :title do |entry|
|
74
|
+
render 'attributes_table', :entry => entry
|
75
|
+
render 'links', :entry => entry
|
76
|
+
|
77
|
+
div :class => 'columns' do
|
78
|
+
render 'members', :entry => entry
|
79
|
+
render 'revisions', :entry => entry
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
controller do
|
84
|
+
helper FoldersHelper
|
85
|
+
helper Admin::RevisionsHelper
|
86
|
+
|
87
|
+
def scoped_collection
|
88
|
+
params.key?(:folder_id) ? super.where(:folder_id => params[:folder_id]) : super
|
89
|
+
end
|
90
|
+
|
91
|
+
def build_new_resource
|
92
|
+
super.tap do |entry|
|
93
|
+
entry.account ||= current_user.account
|
94
|
+
entry.theme ||= entry.account.default_theme
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def permitted_params
|
99
|
+
result = params.permit(:entry => [:title, :account_id, :theme_id, :folder_id])
|
100
|
+
restrict_attributes(params[:id], result[:entry]) if result[:entry]
|
101
|
+
result
|
102
|
+
end
|
103
|
+
|
104
|
+
private
|
105
|
+
|
106
|
+
def restrict_attributes(id, attributes)
|
107
|
+
attributes.except!(:account_id, :theme_id) unless authorized?(:read, Account)
|
108
|
+
attributes.except!(:folder_id) unless authorized?(:manage, Folder)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Pageflow
|
2
|
+
ActiveAdmin.register Folder, :as => 'Folder' do
|
3
|
+
menu false
|
4
|
+
|
5
|
+
# TODO
|
6
|
+
actions :new, :create, :edit, :update, :destroy
|
7
|
+
|
8
|
+
form do |f|
|
9
|
+
f.inputs do
|
10
|
+
if authorized?(:read, Account) && f.object.new_record?
|
11
|
+
f.input :account, :include_blank => false
|
12
|
+
end
|
13
|
+
f.input :name
|
14
|
+
end
|
15
|
+
f.actions do
|
16
|
+
f.action(:submit)
|
17
|
+
f.action(:cancel, :wrapper_html => {:class => 'cancel'})
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
controller do
|
22
|
+
def build_new_resource
|
23
|
+
super.tap do |folder|
|
24
|
+
folder.account ||= current_user.account
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def create
|
29
|
+
super do |success, failure|
|
30
|
+
success.html { redirect_to(admin_entries_path) }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def update
|
35
|
+
super do |success, failure|
|
36
|
+
success.html { redirect_to(admin_entries_path(:folder_id => resource.id)) }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def destroy
|
41
|
+
super do |success, failure|
|
42
|
+
success.html { redirect_to(admin_entries_path) }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def permitted_params
|
47
|
+
result = params.permit(:folder => [:name, :account_id])
|
48
|
+
restrict_attributes(params[:id], result[:folder]) if result[:folder]
|
49
|
+
result
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def restrict_attributes(id, attributes)
|
55
|
+
attributes.except!(:account_id) if !authorized?(:read, Account) || id.present?
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Pageflow
|
2
|
+
ActiveAdmin.register Membership, :as => 'Membership' do
|
3
|
+
menu false
|
4
|
+
|
5
|
+
actions :new, :create, :destroy
|
6
|
+
|
7
|
+
form :partial => 'form'
|
8
|
+
|
9
|
+
controller do
|
10
|
+
belongs_to :entry, :parent_class => Pageflow::Entry, :polymorphic => true
|
11
|
+
belongs_to :user, :parent_class => User, :polymorphic => true
|
12
|
+
|
13
|
+
helper Pageflow::UsersHelper
|
14
|
+
helper Pageflow::EntriesHelper
|
15
|
+
|
16
|
+
def permitted_params
|
17
|
+
params.permit(:membership => [:user_id, :entry_id])
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Pageflow
|
2
|
+
ActiveAdmin.register Revision, :as => 'Revision' do
|
3
|
+
menu false
|
4
|
+
|
5
|
+
actions :edit, :update, :show
|
6
|
+
|
7
|
+
form :partial => 'form'
|
8
|
+
|
9
|
+
member_action :restore, :method => :post do
|
10
|
+
revision = Revision.find(params[:id])
|
11
|
+
entry = revision.entry
|
12
|
+
authorize!(:restore, entry)
|
13
|
+
|
14
|
+
entry.edit_lock.aquire(current_user)
|
15
|
+
revision.entry.restore(:revision => revision, :creator => current_user)
|
16
|
+
entry.edit_lock.release(current_user)
|
17
|
+
|
18
|
+
redirect_to(admin_entry_path(entry, :notice => I18n.t('admin.revisions.restored')))
|
19
|
+
end
|
20
|
+
|
21
|
+
controller do
|
22
|
+
include EditLocking
|
23
|
+
|
24
|
+
def permitted_params
|
25
|
+
params.permit(:revision => [:published_until])
|
26
|
+
end
|
27
|
+
|
28
|
+
def show
|
29
|
+
redirect_to([:admin, resource.entry])
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,184 @@
|
|
1
|
+
module Pageflow
|
2
|
+
ActiveAdmin.register User do
|
3
|
+
menu :priority => 2
|
4
|
+
|
5
|
+
config.batch_actions = false
|
6
|
+
config.clear_action_items!
|
7
|
+
|
8
|
+
index do
|
9
|
+
column :full_name, :sortable => 'last_name' do |user|
|
10
|
+
link_to(user.full_name, admin_user_path(user))
|
11
|
+
end
|
12
|
+
column :email
|
13
|
+
if authorized?(:read, Account)
|
14
|
+
column :account, :sortable => 'account_id' do |user|
|
15
|
+
link_to(user.account.name, admin_account_path(user.account))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
column :role, :sortable => 'role' do |user|
|
19
|
+
I18n.t(user.role, :scope => 'admin.users.roles')
|
20
|
+
end
|
21
|
+
column :last_sign_in_at
|
22
|
+
column :sign_in_count
|
23
|
+
boolean_status_tag_column :suspended?
|
24
|
+
end
|
25
|
+
|
26
|
+
filter :last_name
|
27
|
+
filter :first_name
|
28
|
+
filter :email
|
29
|
+
|
30
|
+
action_item :only => :index do
|
31
|
+
link_to I18n.t('admin.users.invite_user'), new_admin_user_path, :data => {:rel => 'invite_user'}
|
32
|
+
end
|
33
|
+
|
34
|
+
show do |user|
|
35
|
+
div :class => :columns do
|
36
|
+
div do
|
37
|
+
attributes_table_for user do
|
38
|
+
row :last_name, :class => 'last_name'
|
39
|
+
row :first_name, :class => 'first_name'
|
40
|
+
row :email, :class => 'email'
|
41
|
+
if authorized?(:read, Account)
|
42
|
+
row :account, :class => 'account'
|
43
|
+
end
|
44
|
+
row :role, :class => 'role' do
|
45
|
+
span 'data-user-role' => user.role do
|
46
|
+
I18n.t(user.role, :scope => 'admin.users.roles')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
row :created_at
|
51
|
+
row :last_sign_in_at
|
52
|
+
boolean_status_tag_row :suspended?
|
53
|
+
end
|
54
|
+
|
55
|
+
para do
|
56
|
+
link_to I18n.t('admin.users.resend_invitation'), resend_invitation_admin_user_path(user), :method => :post, :class => 'button', :data => {:rel => 'resend_invitation'}
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
panel I18n.t('activerecord.models.entry.other') do
|
61
|
+
if user.memberships.any?
|
62
|
+
table_for user.memberships, :class => 'memberships', :i18n => Membership do
|
63
|
+
column :entry do |membership|
|
64
|
+
link_to(membership.entry.title, admin_entry_path(membership.entry))
|
65
|
+
end
|
66
|
+
column do |membership|
|
67
|
+
if authorized?(:destroy, membership)
|
68
|
+
link_to(I18n.t('admin.users.delete'), admin_user_membership_path(user, membership), :method => :delete, :data => {:confirm => I18n.t('active_admin.delete_confirmation'), :rel => 'delete_membership'})
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
else
|
73
|
+
div :class => "blank_slate_container" do
|
74
|
+
span :class => "blank_slate" do
|
75
|
+
I18n.t('admin.users.empty')
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
span do
|
81
|
+
link_to I18n.t('admin.users.add_entry'), new_admin_user_membership_path(user), :class => 'button', :data => {:rel => 'add_membership'}
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
action_item :only => :show do
|
88
|
+
link_to I18n.t('admin.users.edit'), edit_admin_user_path(user), :data => {:rel => 'edit_user'}
|
89
|
+
end
|
90
|
+
|
91
|
+
action_item :only => :show do
|
92
|
+
if user != current_user
|
93
|
+
if user.suspended?
|
94
|
+
link_to I18n.t('admin.users.unsuspend'), unsuspend_admin_user_path(user), :method => :post, :data => {:rel => 'unsuspend_user'}
|
95
|
+
else
|
96
|
+
link_to I18n.t('admin.users.suspend'), suspend_admin_user_path(user), :method => :post, :data => {:rel => 'suspend_user'}
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
action_item :only => :show do
|
102
|
+
if user != current_user
|
103
|
+
link_to I18n.t('admin.users.delete'), admin_user_path(user), :method => :delete, :data => {:rel => 'delete_user', :confirm => I18n.t('admin.users.confirm_delete')}
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
form do |f|
|
108
|
+
f.inputs "Details" do
|
109
|
+
f.input :email, :hint => f.object.new_record? && I18n.t('admin.users.email_invitation_hint')
|
110
|
+
f.input :first_name
|
111
|
+
f.input :last_name
|
112
|
+
if authorized?(:read, Account)
|
113
|
+
f.input :account, :include_blank => false
|
114
|
+
end
|
115
|
+
f.input :role, :collection => collection_for_user_roles, :include_blank => false, :hint => authorized?(:read, Account) ? I18n.t('admin.users.role_hint.admin') : I18n.t('admin.users.role_hint.other')
|
116
|
+
end
|
117
|
+
f.actions
|
118
|
+
end
|
119
|
+
|
120
|
+
collection_action 'me', :title => 'Profil', :method => [:get, :patch] do
|
121
|
+
if request.patch?
|
122
|
+
if current_user.update_with_password(user_profile_params)
|
123
|
+
sign_in current_user, :bypass => true
|
124
|
+
redirect_to admin_root_path, :notice => I18n.t('admin.users.me.updated')
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
collection_action 'delete_me', :title => 'Konto entfernen', :method => [:get, :delete] do
|
130
|
+
if request.delete?
|
131
|
+
if current_user.destroy_with_password(params.require(:user)[:current_password])
|
132
|
+
redirect_to admin_root_path, :notice => I18n.t('admin.users.me.updated')
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
member_action :resend_invitation, :method => :post do
|
138
|
+
InvitedUser.find(params[:id]).send_invitation!
|
139
|
+
redirect_to :back, :notice => I18n.t('admin.users.resent_invitation')
|
140
|
+
end
|
141
|
+
|
142
|
+
member_action :suspend, :method => :post do
|
143
|
+
User.find(params[:id]).suspend!
|
144
|
+
redirect_to :back, :notice => I18n.t('admin.users.suspended')
|
145
|
+
end
|
146
|
+
|
147
|
+
member_action :unsuspend, :method => :post do
|
148
|
+
User.find(params[:id]).unsuspend!
|
149
|
+
redirect_to :back, :notice => I18n.t('admin.users.unsuspended')
|
150
|
+
end
|
151
|
+
|
152
|
+
controller do
|
153
|
+
helper Pageflow::UsersHelper
|
154
|
+
|
155
|
+
def build_new_resource
|
156
|
+
user = InvitedUser.new(permitted_params[:user])
|
157
|
+
user.account ||= current_user.account
|
158
|
+
user
|
159
|
+
end
|
160
|
+
|
161
|
+
def user_profile_params
|
162
|
+
params.require(:user).permit(:first_name, :last_name, :current_password, :password, :password_confirmation)
|
163
|
+
end
|
164
|
+
|
165
|
+
def permitted_params
|
166
|
+
result = params.permit(:user => [:first_name, :last_name, :email, :password, :password_confirmation, :account_id, :role])
|
167
|
+
restrict_attributes(params[:id], result[:user]) if result[:user]
|
168
|
+
result
|
169
|
+
end
|
170
|
+
|
171
|
+
private
|
172
|
+
|
173
|
+
def restrict_attributes(id, attributes)
|
174
|
+
if !authorized?(:read, Account)
|
175
|
+
attributes.delete(:account_id)
|
176
|
+
end
|
177
|
+
|
178
|
+
if !authorized?(:read, Account) && !User::NON_ADMIN_ROLES.include?(attributes[:role])
|
179
|
+
attributes.delete(:role)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|