From 269ae86e5afd3361659c1b81d8a6d7f8d570ad6d Mon Sep 17 00:00:00 2001 From: Guillermo Alejandro Gallardo Diez Date: Sat, 4 Jan 2025 01:24:31 +0100 Subject: [PATCH] chore: update tests --- test/__snapshots__/make.test.ts.snap | 1623 +++++++++++++++++++++++++- 1 file changed, 1583 insertions(+), 40 deletions(-) diff --git a/test/__snapshots__/make.test.ts.snap b/test/__snapshots__/make.test.ts.snap index be9031759..9ec8abbc6 100644 --- a/test/__snapshots__/make.test.ts.snap +++ b/test/__snapshots__/make.test.ts.snap @@ -1,28 +1,1586 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`create contract 'rs': --contract_rs--.git--COMMIT_EDITMSG 1`] = ` +[ + "--contract_rs--.git--COMMIT_EDITMSG", + "init +", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--HEAD 1`] = ` +[ + "--contract_rs--.git--HEAD", + "ref: refs/heads/main +", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--config 1`] = ` +[ + "--contract_rs--.git--config", + "[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--description 1`] = ` +[ + "--contract_rs--.git--description", + "Unnamed repository; edit this file 'description' to name the repository. +", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--hooks--applypatch-msg.sample 1`] = ` +[ + "--contract_rs--.git--hooks--applypatch-msg.sample", + "#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +commitmsg="$(git rev-parse --git-path hooks/commit-msg)" +test -x "$commitmsg" && exec "$commitmsg" \${1+"$@"} +: +", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--hooks--commit-msg.sample 1`] = ` +[ + "--contract_rs--.git--hooks--commit-msg.sample", + "#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\\(.*>\\).*$/Signed-off-by: \\1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +} +", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--hooks--fsmonitor-watchman.sample 1`] = ` +[ + "--contract_rs--.git--hooks--fsmonitor-watchman.sample", + "#!/usr/bin/perl + +use strict; +use warnings; +use IPC::Open2; + +# An example hook script to integrate Watchman +# (https://facebook.github.io/watchman/) with git to speed up detecting +# new and modified files. +# +# The hook is passed a version (currently 2) and last update token +# formatted as a string and outputs to stdout a new update token and +# all files that have been modified since the update token. Paths must +# be relative to the root of the working tree and separated by a single NUL. +# +# To enable this hook, rename this file to "query-watchman" and set +# 'git config core.fsmonitor .git/hooks/query-watchman' +# +my ($version, $last_update_token) = @ARGV; + +# Uncomment for debugging +# print STDERR "$0 $version $last_update_token\\n"; + +# Check the hook interface version +if ($version ne 2) { + die "Unsupported query-fsmonitor hook version '$version'.\\n" . + "Falling back to scanning...\\n"; +} + +my $git_work_tree = get_working_dir(); + +my $retry = 1; + +my $json_pkg; +eval { + require JSON::XS; + $json_pkg = "JSON::XS"; + 1; +} or do { + require JSON::PP; + $json_pkg = "JSON::PP"; +}; + +launch_watchman(); + +sub launch_watchman { + my $o = watchman_query(); + if (is_work_tree_watched($o)) { + output_result($o->{clock}, @{$o->{files}}); + } +} + +sub output_result { + my ($clockid, @files) = @_; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # binmode $fh, ":utf8"; + # print $fh "$clockid\\n@files\\n"; + # close $fh; + + binmode STDOUT, ":utf8"; + print $clockid; + print "\\0"; + local $, = "\\0"; + print @files; +} + +sub watchman_clock { + my $response = qx/watchman clock "$git_work_tree"/; + die "Failed to get clock id on '$git_work_tree'.\\n" . + "Falling back to scanning...\\n" if $? != 0; + + return $json_pkg->new->utf8->decode($response); +} + +sub watchman_query { + my $pid = open2(\\*CHLD_OUT, \\*CHLD_IN, 'watchman -j --no-pretty') + or die "open2() failed: $!\\n" . + "Falling back to scanning...\\n"; + + # In the query expression below we're asking for names of files that + # changed since $last_update_token but not from the .git folder. + # + # To accomplish this, we're using the "since" generator to use the + # recency index to select candidate nodes and "fields" to limit the + # output to file names only. Then we're using the "expression" term to + # further constrain the results. + my $last_update_line = ""; + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\\"$last_update_token\\""; + $last_update_line = qq[\\n"since": $last_update_token,]; + } + my $query = <<" END"; + ["query", "$git_work_tree", {$last_update_line + "fields": ["name"], + "expression": ["not", ["dirname", ".git"]] + }] + END + + # Uncomment for debugging the watchman query + # open (my $fh, ">", ".git/watchman-query.json"); + # print $fh $query; + # close $fh; + + print CHLD_IN $query; + close CHLD_IN; + my $response = do {local $/; }; + + # Uncomment for debugging the watch response + # open ($fh, ">", ".git/watchman-response.json"); + # print $fh $response; + # close $fh; + + die "Watchman: command returned no output.\\n" . + "Falling back to scanning...\\n" if $response eq ""; + die "Watchman: command returned invalid output: $response\\n" . + "Falling back to scanning...\\n" unless $response =~ /^\\{/; + + return $json_pkg->new->utf8->decode($response); +} + +sub is_work_tree_watched { + my ($output) = @_; + my $error = $output->{error}; + if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) { + $retry--; + my $response = qx/watchman watch "$git_work_tree"/; + die "Failed to make watchman watch '$git_work_tree'.\\n" . + "Falling back to scanning...\\n" if $? != 0; + $output = $json_pkg->new->utf8->decode($response); + $error = $output->{error}; + die "Watchman: $error.\\n" . + "Falling back to scanning...\\n" if $error; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # close $fh; + + # Watchman will always return all files on the first query so + # return the fast "everything is dirty" flag to git and do the + # Watchman query just to get it over with now so we won't pay + # the cost in git to look up each individual file. + my $o = watchman_clock(); + $error = $output->{error}; + + die "Watchman: $error.\\n" . + "Falling back to scanning...\\n" if $error; + + output_result($o->{clock}, ("/")); + $last_update_token = $o->{clock}; + + eval { launch_watchman() }; + return 0; + } + + die "Watchman: $error.\\n" . + "Falling back to scanning...\\n" if $error; + + return 1; +} + +sub get_working_dir { + my $working_dir; + if ($^O =~ 'msys' || $^O =~ 'cygwin') { + $working_dir = Win32::GetCwd(); + $working_dir =~ tr/\\\\/\\//; + } else { + require Cwd; + $working_dir = Cwd::cwd(); + } + + return $working_dir; +} +", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--hooks--post-update.sample 1`] = ` +[ + "--contract_rs--.git--hooks--post-update.sample", + "#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info +", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--hooks--pre-applypatch.sample 1`] = ` +[ + "--contract_rs--.git--hooks--pre-applypatch.sample", + "#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +precommit="$(git rev-parse --git-path hooks/pre-commit)" +test -x "$precommit" && exec "$precommit" \${1+"$@"} +: +", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--hooks--pre-commit.sample 1`] = ` +[ + "--contract_rs--.git--hooks--pre-commit.sample", + "#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=$(git hash-object -t tree /dev/null) +fi + +# If you want to allow non-ASCII filenames set this variable to true. +allownonascii=$(git config --type=bool hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ASCII filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\\0' | wc -c) != 0 +then + cat <<\\EOF +Error: Attempt to add a non-ASCII file name. + +This can cause problems if you want to work with people on other platforms. + +To be portable it is advisable to rename the file. + +If you know what you are doing you can disable this check using: + + git config hooks.allownonascii true +EOF + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against -- +", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--hooks--pre-merge-commit.sample 1`] = ` +[ + "--contract_rs--.git--hooks--pre-merge-commit.sample", + "#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git merge" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message to +# stderr if it wants to stop the merge commit. +# +# To enable this hook, rename this file to "pre-merge-commit". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" +: +", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--hooks--pre-push.sample 1`] = ` +[ + "--contract_rs--.git--hooks--pre-push.sample", + "#!/bin/sh + +# An example hook script to verify what is about to be pushed. Called by "git +# push" after it has checked the remote status, but before anything has been +# pushed. If this script exits with a non-zero status nothing will be pushed. +# +# This hook is called with the following parameters: +# +# $1 -- Name of the remote to which the push is being done +# $2 -- URL to which the push is being done +# +# If pushing without using a named remote those arguments will be equal. +# +# Information about the commits which are being pushed is supplied as lines to +# the standard input in the form: +# +# +# +# This sample shows how to prevent push of commits where the log message starts +# with "WIP" (work in progress). + +remote="$1" +url="$2" + +zero=$(git hash-object --stdin &2 "Found WIP commit in $local_ref, not pushing" + exit 1 + fi + fi +done + +exit 0 +", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--hooks--pre-rebase.sample 1`] = ` +[ + "--contract_rs--.git--hooks--pre-rebase.sample", + "#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=\`git symbolic-ref HEAD\` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=\`git rev-list --pretty=oneline ^master "$topic"\` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=\`git rev-list ^master "^$topic" \${publish} | sort\` +only_next_2=\`git rev-list ^master \${publish} | sort\` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=\`git rev-list "^$topic" master\` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up to date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=\`git rev-list --pretty=oneline ^\${publish} "$topic"\` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \\ / + / / / b---b C \\ / + / / / / \\ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END +", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--hooks--pre-receive.sample 1`] = ` +[ + "--contract_rs--.git--hooks--pre-receive.sample", + "#!/bin/sh +# +# An example hook script to make use of push options. +# The example simply echoes all push options that start with 'echoback=' +# and rejects all pushes when the "reject" push option is used. +# +# To enable this hook, rename this file to "pre-receive". + +if test -n "$GIT_PUSH_OPTION_COUNT" +then + i=0 + while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" + do + eval "value=\\$GIT_PUSH_OPTION_$i" + case "$value" in + echoback=*) + echo "echo from the pre-receive-hook: \${value#*=}" >&2 + ;; + reject) + exit 1 + esac + i=$((i + 1)) + done +fi +", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--hooks--prepare-commit-msg.sample 1`] = ` +[ + "--contract_rs--.git--hooks--prepare-commit-msg.sample", + "#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first one removes the +# "# Please enter the commit message..." help message. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +COMMIT_MSG_FILE=$1 +COMMIT_SOURCE=$2 +SHA1=$3 + +/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE" + +# case "$COMMIT_SOURCE,$SHA1" in +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\\n" . \`git diff --cached --name-status -r\` +# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;; +# *) ;; +# esac + +# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\\(.*>\\).*$/Signed-off-by: \\1/p') +# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE" +# if test -z "$COMMIT_SOURCE" +# then +# /usr/bin/perl -i.bak -pe 'print "\\n" if !$first_line++' "$COMMIT_MSG_FILE" +# fi +", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--hooks--push-to-checkout.sample 1`] = ` +[ + "--contract_rs--.git--hooks--push-to-checkout.sample", + "#!/bin/sh + +# An example hook script to update a checked-out tree on a git push. +# +# This hook is invoked by git-receive-pack(1) when it reacts to git +# push and updates reference(s) in its repository, and when the push +# tries to update the branch that is currently checked out and the +# receive.denyCurrentBranch configuration variable is set to +# updateInstead. +# +# By default, such a push is refused if the working tree and the index +# of the remote repository has any difference from the currently +# checked out commit; when both the working tree and the index match +# the current commit, they are updated to match the newly pushed tip +# of the branch. This hook is to be used to override the default +# behaviour; however the code below reimplements the default behaviour +# as a starting point for convenient modification. +# +# The hook receives the commit with which the tip of the current +# branch is going to be updated: +commit=$1 + +# It can exit with a non-zero status to refuse the push (when it does +# so, it must not modify the index or the working tree). +die () { + echo >&2 "$*" + exit 1 +} + +# Or it can make any necessary changes to the working tree and to the +# index to bring them to the desired state when the tip of the current +# branch is updated to the new commit, and exit with a zero status. +# +# For example, the hook can simply run git read-tree -u -m HEAD "$1" +# in order to emulate git fetch that is run in the reverse direction +# with git push, as the two-tree form of git read-tree -u -m is +# essentially the same as git switch or git checkout that switches +# branches while keeping the local changes in the working tree that do +# not interfere with the difference between the branches. + +# The below is a more-or-less exact translation to shell of the C code +# for the default behaviour for git's push-to-checkout hook defined in +# the push_to_deploy() function in builtin/receive-pack.c. +# +# Note that the hook will be executed from the repository directory, +# not from the working tree, so if you want to perform operations on +# the working tree, you will have to adapt your code accordingly, e.g. +# by adding "cd .." or using relative paths. + +if ! git update-index -q --ignore-submodules --refresh +then + die "Up-to-date check failed" +fi + +if ! git diff-files --quiet --ignore-submodules -- +then + die "Working directory has unstaged changes" +fi + +# This is a rough translation of: +# +# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX +if git cat-file -e HEAD 2>/dev/null +then + head=HEAD +else + head=$(git hash-object -t tree --stdin &2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 )" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "usage: $0 " >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --type=bool hooks.allowunannotated) +allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch) +denycreatebranch=$(git config --type=bool hooks.denycreatebranch) +allowdeletetag=$(git config --type=bool hooks.allowdeletetag) +allowmodifytag=$(git config --type=bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero=$(git hash-object --stdin &2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0 +", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--index 1`] = ` +[ + "--contract_rs--.git--index", + "DIRC gx|w-Ϟgx|w-Ϟ9������ �{e�;��ژwm�Nwm/�m'.github/workflows/deploy-production.ymlgx|w-��;gx|w-��;9����� +�^q+/2?H�8�&#m6�)$.github/workflows/deploy-staging.ymlgx|w-�f�gx|w-�f�9�������z���Ȟ�4�� �[�E.github/workflows/test.ymlgx|w-���gx|w-���9�����+��k}���zA���K����&.github/workflows/undeploy-staging.ymlgx|w-�M +gx|w-�M +9������K��_ow�]����4�n�ݺ +.gitignoregx| �gx| �9�,������4b�M��P�Pw�'���N� +Cargo.lockgx|w-�[gx|w-�[9�����x8�u,*��_�q���!%�ۄ +Cargo.tomlgx|w-�X�gx|w-�X�9�����%R�o��� 1735949439 +0100 commit (initial): init +", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--logs--refs--heads--main 1`] = ` +[ + "--contract_rs--.git--logs--refs--heads--main", + "0000000000000000000000000000000000000000 2202adf5dd50b090722801b35b6f5e3c8353e29e Guillermo Alejandro Gallardo Diez 1735949439 +0100 commit (initial): init +", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--objects--2b--61e619c1e01e433ccbda936d1e0bc465792f13 1`] = ` +[ + "--contract_rs--.git--objects--2b--61e619c1e01e433ccbda936d1e0bc465792f13", + "x�SMo�0�_� +R�H\`z��JHHܐ����,�3���z���vU��3^v�M� ���ޛ�u���ty�f �sO�.��U��&�ƣ�(�V��щ�(ʧqs�.O{H6{�6�F�_�@C�Kټ_�q��j +)a��ky�V�|d1v�Yڊ+�&�ô��: �n{�� ��eY�u����|�PK���%�Q���SnI����i�����zV������������_#u �9�s=�꘤Zx0-��rn*��}&c��!�\\��<�<�Yl��6�p�N9ˆ@��,�&ȦK�Ǯn�d�::�JO-�S=fiQ�P���E�� )�Ql�H�.yvwZvI���B�*6! +��B�ף�� +[�����I@��a'�n�^����V������ +P���ϜX��l�Y���ɇ���*e", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--objects--5e--712b2f13323f48e3381bdd2623036d36169d29 1`] = ` +[ + "--contract_rs--.git--objects--5e--712b2f13323f48e3381bdd2623036d36169d29", + "x�VQo�6޳�!� +�&P�@����I��vV ]�P�Y�L�*I�5���)ّ�i��m~�%�xw���K�N��͛��/�gXJ���:� �w��u�Jʹ�OZ��t�҉��.|�*��Q��-�$�h�ZH��������|ԳF����a�U��TW��M!�Z���w�5N��k��-|�?�S)��*P%��b�����j];0�'���x6�f���|:럏����\`pu3��Gg=ȗ��/_��g�kT.RU����_#����F��*"a�@c��k�1Xb�ҕ����i� +��@j�:�8m$]�R��)) +����\\��(=H+#���h�v�t�\\i���]G'�.�ta���uS]�^]x�T +fllP"��Ǚ�(�y�_G���q[���4�]��e���ہAJʮ{k��Ї�jb^NO��KT�u���I���a���T�>L�YH�7l���TƊ�E��#�c�����r�,A��u(�.��2� +�*����a-2�XY%R�l����7T������\`~1�#�;�bE��߬lt����#��Z-D����p��jr��͆��JɅr����ŚR�|�;�2�'���ai�n�ɵH�w�a�z2��?>vT�S�L��5�/\`y��T�o2П�����>�K�{����(��Д��K����#����� +h�37Q[h'����p럱ߋ�7��'q�&�[��xA�YrKn2�Z"-'Z \\e �A+��ڥV����X�t�r��}�Γ��Y��DH�|�ʫ��ʤ8M���V] _s!y"�칊P� ����p����"x�7X�M8!�5�ԍ�JȌ"�sK"�����Tt/�Cj2D͔�Է����Q?{0��]4$Py���.Z�G��o����p܃֘�� +���ЃbʗP��l;h��刪)�u�i=�ѡ�|A^„F�K�pԽ�����#�.������i�4������G��1�&��l����:�+V�", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--objects--7f--847afdaeeabf06c89ef634b108f40bb05bc845 1`] = ` +[ + "--contract_rs--.git--objects--7f--847afdaeeabf06c89ef634b108f40bb05bc845", + "x�R�N1 e���D Uʄ��Ą�Q.�+Gsq;TH|��+�5���x�=�r#{Q�|��w�� ��C uK0����A�]vZ�\`�%��ý���=����昖R~�v7�'���XZQ/k��Y L\\��j��u�>7c�V��k{�"��Va�������{�\\B�UF݅���!���?���X�N��_��A", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--objects--16--3f8e8f0a4d5b635960c4d7c79906effd577c66 1`] = ` +[ + "--contract_rs--.git--objects--16--3f8e8f0a4d5b635960c4d7c79906effd577c66", + "x+)JMU04�d040031QHI-�ɯ�-(�O)M.���ӫ��aPh�N]o�e߭��$��s�/�j(.IL��K��+��6��xl!}WM�9�Ll�&TuIjq XM}K��u�������d#�� +�'\\�jJ�@6��e��ڮ���W9�=tԻo����"-I�", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--objects--20--857b65af3bf4beda98776da6184e776d2fd16d 1`] = ` +[ + "--contract_rs--.git--objects--20--857b65af3bf4beda98776da6184e776d2fd16d", + "x�R]o�@�ٿbU!��lZࡑ�N�FI��:����κ��Q����J�*~�t;;3;�%�%\\]�}!h�#�\`����^��V�II1�z�[�(U�z_;��M}���5�� �}=N↙֖�^��˽N<&>tw���E| d�?n <��d�)�d�x��7s��#uy&�� .i}T$�W������� +�Pź�{���'���_�~�8 #��݈ú����ĥN��ɞ��^����*ϧ�U�.��j���r����<[̋q�.���&��pߎt��T�^̐���g]��gD*)6�y��|�^��Ohi��I�� +�5nSl�n�l��D���HoKΪ���y���,-��_Nx9f?��5V +�3]��O�|� ���~{�40", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--objects--22--02adf5dd50b090722801b35b6f5e3c8353e29e 1`] = ` +[ + "--contract_rs--.git--objects--22--02adf5dd50b090722801b35b6f5e3c8353e29e", + "xm�� +�0E]�+f/��J +� t��ɴF�� �Ư��w��Ź�JI�s�ʈ��u�9=����;�h��⬍�VN�L1�-*�z#�=?�*ʇ���Ç���3���{����]�a�R�ȅ���������s$�$|B��%�ǐ���Q�?=��T� v~�S���5X�6���D�M|�K��?}�#��fa��]�LFIk�4���\\�Zh��.�RUgl{�6b�R���5^��P�s��8�o�m��{N�"!w�XYY;#��h�WѲ�$k�� +�A��b��� .�����������њ�)SA&�ӡ� +>�T}���J��>e����S(ڬ�@}����_>��U��5�p%�R>�ƭ9�ؒ�B�.���� +�7 \`����R4��N�+N�n��Ғ�Q?!T��U6 +4z%NZC��>�'�3�;.l�oc�,G%�E��!�YQ桋)/����Hr-�V��B겂�D���(��rNa +��.@����Ufj�6���5�#���������^�ۉ�S=����t�u}wW���k�w��)���E}sw��_9�� )5���.+b�����_$.v2[���J�7�e����'a�(�.�������,�-ZpKq(��P��H�(�S����#$��.נ���������xr=5f����D:,^.��}��5�A1g|��4��k�<_ߠ\`Zvh�5z��)�R�򩝸��������a e�+��?�i�oow��8� Dt�b;�Y�Ŋ���+�Qb)��G��9�:�;%Y��*ϝ�-7D��eg&��Y�@�&�v���ſ=���w�e��{��o�3��6����.�\\�zS�j:;�,�βҭ �C�i +����h�b��=�ԒC�(C��J���,�� +[[M;L��l��L�����$l-��F � ��^�'��\`��6b���^]�.���;b���'�5W�:U%��������DjZ~��������%؝%1w��iM.g� ��b�\`���Vl�C�1ߨ�[�&z"b���5��#��}e'ދ:���5^����i�(�� ���M�� �QjJ��Ԗ�O�V���c�%Lh=�KvԖ���~�w�/��l1�)�������N���G\`���", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--objects--52--e76ff9daf0a73c51b2f6cd328c99efed273331 1`] = ` +[ + "--contract_rs--.git--objects--52--e76ff9daf0a73c51b2f6cd328c99efed273331", + "x�S���0圯�*m�¡B��A�H��T!ձ����{���=cwi +�.�e�yo�Ik���7o�_͠��b�CQH�;,��?�r��CK*�қ� ������@�� +�(��O�b�����g��uO4�E]w���V�:)�h�)��-�b�۵"��V �M:��R|�]h�YF��wA�G����aЎ��p��?�5t[��i��U�l\`4����� ���p1�}�?��,��/��0T����<�0�;!%FG�Q�ϳ~ z-��;p�%l'�_D _>��C�'��� I<�8f�� �=�G��UrL��j�H7����a%��̔M��Ey��0��S��ęAI��Р�I^�\\&�2TY }Wu�=WԆ�Nn%��L�� �@B�>j��x�y�����2���mi[j]�U�nN�P���$z51�,�M�����b��d�����Kt����c�z���8�D� +�B��lS��?���As�9]�R�N��GCr�", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--objects--57--f124b159237d3a5e8f9c55c3486c9ec430158a 1`] = ` +[ + "--contract_rs--.git--objects--57--f124b159237d3a5e8f9c55c3486c9ec430158a", + "x+)JMU06a040031Q��L�+*fXߕm�����[��F���]�CD-$<�", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--objects--a3--492992f5f403784d30abdf232d40bc3bdc55e1 1`] = ` +[ + "--contract_rs--.git--objects--a3--492992f5f403784d30abdf232d40bc3bdc55e1", + "x+)JMU0�4a01��̒��$���o٦z�?ޓ�����β�W7T + �LL�J2���R^�x��_�=v�ڞ&���rN,J����O�f�e"�4�w�ր����{����EQU����\`��TGK�ɫ����>�WdP=x��*�����U/7�!�y��[��n�v֨g����ƆPEE��%�%��9���yz\`3Wh�3���� ���}R{������(�!����H�Z���9��=r�1�Ȗ��3�x�#��K�+ΤX���b���h�{�", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--objects--a8--2ade34d22f67e069ef93c88e1a1828bc2fbec3 1`] = ` +[ + "--contract_rs--.git--objects--a8--2ade34d22f67e069ef93c88e1a1828bc2fbec3", + "x5�=� @agNA�����IC!��5P��e��%_�O��j&+�)�x�S#D1�MC�)� +��HR�Z(�ʞ�,G��c�f��ĝ���ޒ"�", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--objects--af--8a6b37fa42e1efda3141320ff71f4443541539 1`] = ` +[ + "--contract_rs--.git--objects--af--8a6b37fa42e1efda3141320ff71f4443541539", + "x�T�j�0���b��b�݅<�Jsi ���O!,Z{l���V��4�w�[�m�[��蜙s�j�����.�,� �i(T���Y�$0 ��[��)m�D"Ӊ�U� �_�M�e�BUq�ޝ�<ÒK[#�JZ�r �j�[�18���ᰳ6tF��m�(�6d�@O�-�U�V�;v��X2'l �5�k\`Ϊ�H�D���3����� +x��O�R���K }�0���EQB����[Ρ.��j�XE =�0�[6>l�~�zW}�g��i�C�w�9��n#x +�Z���h�qz�=a|Xg�_]߭/o���~\\��� �y�v=d� +Q�zВ�t��$C\`� %1�z~���,�qk +�q�1�g\`Q���e#aj̕. p;�ff�G�"�XlJ4�I"=���S�f�:|��I{��ό���]D7�����4��XP% +�(�@�� �^�\\�� +B{���ۨ'�%�� +�����Q=�3���M�����{0�(����j���Z>kR���mVR�FP唬��U����F��7śظ-�,;"�zڇ�>������M ���}s���,]��RRA� ��(�_<�i�Q\`j��Wq۰����1΋�ڮ���x�$3�F��O�n�w{(4!��'OeD������1�]�C\\2e��^����%#�]����}", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--objects--ba--341b62934db2b550d7135077e2278cf58d4ecd 1`] = ` +[ + "--contract_rs--.git--objects--ba--341b62934db2b550d7135077e2278cf58d4ecd", + "x��Io��%�^�O!�ZfQ�CD�G4Ы���P |��Sr����y �S���YûEQ�͎�s����?�I�ʲ��|����>�����V/�����nn~~��tw�c�ܵ�꟟���������O���zw�?w��]����O���Ku�kwϻ�/���g��������>��������[���?��w�m���]�5����}���4����O�/���}�ݗ���������������=}�?7�������|uS�}��&>�������G���?��]����6���[�e��W�H6]����j�����nӔe�ެ�e�Y�i�����u�T�f�������C ���uO~���ǧ?n��~^?=�t��?�����������Vm�����f�����m��ˊ�[o���$IRE�Mڪ��MR�Ы�]�I�'YٮV]R�&�/�Uڤ�������}J>�����Q�t����d�����#\\�Y�I}�:[e�y�4�Y%����]���n�I�|��i�$u��M��.ҲY�}�mڴ��iY5EW;��mQ���8���Fq���鹻�~x���ݭo�^x@e�����U���Ɋm�n�<鳮o�m��[��n.��v+�$M������x��� +��ywO�?o��~��t�[q�4y�z񙫴3�t���mUm˪k�+�.+�u�\\m�n[m��^U�/��~;�X?���L|���K���&�n�n�ݴM�7U��y�N7um�%զ�Ҵ�����~�;>i�����4L��z��X=���j��Ҷ]��y�dwޯ7iݶI����OҾ)�"�p�tm]�����u�������Z�=��쮫�(����c��Ϯ�3�\\|va.z�M��if �o�^�mחi���|Ӭk�F���z۔I�m��i��t�u��K���]se�v�CH?�K��i�e]�i�aY�{���U��ǥ��4K�m��k����2k�nH[[q�v�5W�U�x� +O���?wï �SB��;���{�\\}��y��#�x����u��[�m�����\\�EQ�;�-E!M� ��۔�V�uYn�mY9�s�M!������������ަ�JWI���~-b��.m�U���~���,-jE�V���1yWԲ�_ւ�����lˬ��%�UU�}�����v�m���=V}ۤ�̡��慀�56}O}�̘���F�l��mY��]p��*��sRv^���Ԉw���ë��nDw���+���Hl��Ӻ�9�&[e��N�U*�)V�,���"fê�>s �^�YѤE�T�y�m���H�r��s�h�U�{�~�\\= ����wvݍ��2�NmՅ��r5f�]W6D (q@�赶Le-���uW֍?)�Vx����\`���-�İ�ݗ�)�LW��]�/��qx���0Q�eSl�m���\\ �YB�oW���4���R�5�W�eW��.ɫb:O]!f��{#5�H@��d�G|��N��{���j���fU:��T���$�| N[tE��Z�ӭl�c����/0�a�>}�����f��_�䯈j���n4��ȗ�r��J4�o�Z�Qv�(T���O��ل�噥-�T�JV��l$��H�'^���3�πѢ���\`��|�?b�Y%�ͻ���7���B�}-��=�PP�DqB �pQI�֎��85/�cn�G���a�"ٻ��F:��_����ǧ��}�~^/�F> �>��V��U������ �K>�P"�_ W\`��l#6z���� ]���0����fgb� �c�ǿu�>b�M���_��6/koT^�)�'��ti�W������k�b�u��k\\H�'���]�]7��1����_ +���/�W��������������D�0S 1�e����i�N�"nڔ�@[��z���c2e��]��� +w~�$�w�Ӻmz���c��]�H��R�ո���j ��k\`"MKA�]�ˢ����'�~:^|��׋�m�_Y� EYp�Fz._g�9_K���|�U6l�Ɨg��<~mi���亨�������>T7����/ +�M2�|$<���]:.�j�P������[�7��z!Ϻ�2�-�����э4A\\,K��Ի�n,W0a�98U&�F] +�zx�t%�UCiS�߭C���oV�y�<]|���" h7}���(IH8��TD�����⤶�,T�����:x9z����!��V_>��B�ڹ�Z�����6�$%o\\�U��Wް6Qo�q�R�p�p}��"���"��O,������x+1�:﬋���"U�ˇW�,[A��<���b�t��i�����0ȇo_����]p3�xSA*�W_<�B�E�+��v��EZy'��k4i_nR!�2g�[к��'Ŷ�W�*Y�߳�52����m�O�唻��g"^^{�A��©����+�f�ª*S�S��x�Y_�Uo�^\`�u���p��L��L�,�6p���Iś��a���4���� +�×�IZss�ص�_h_�oï����_ᱯ/���������A;�#b���=�� �Yջ�� 8��k��'����q�չ�����?}��A������F� ^~�����J�,��oT���������a����ܚ�4\`�w�t,�<m��bٗ�۝�B���$���F��x%�ta��$�;�C�(�,鋺�J$�R�A P��(l��������㝝��f>�YC <�� +�u�I*���I1���(���f�\\R+�����@�0qC_���%�=����[�v8NF|�s����q��G丸�%��{•yv������ݶ��1K��W{�)��u��y^\`y��\`iJ�.�,�b#�t�v�U��9��}m�lj8]�O_oޣ���J����� f�g����*W�W����v�V���}����ޛfկ]���bHRf.��\\c����.��1�˫<ߢ��e���V��/�e��� W]_��F*�Ns�Jz�ܧ?��{.J,K��䰎�H��g� +I�_W�\\f=���g�xe���Ϫ��]���� +����ETf�tX��Q�BڔJ�uf+�á�Ӧݢ�l�UStR�Sk�X+� ?f�Z� p�]��x�� +x!��ϧSlx�r�'E�=\\�� OO�A���u�;p����E��Vo+��jU�Y�mecy�4+< �Gd�����kQf]�}�I�����8F����9Ȋ����[���n��(]�u%L �͢�r��k$�����t�rg 3�'ܫM�0&��TԳ�, +��ea\\�il >��O�\\�|�]?�Ľ�#SC�=n� ĵ��=��]����S��ݴ�A5U���l�:P��0��?���X�Q�zo�����Γ ]t}{I�xY.��x٫���R���v�6}R�ʹ +N/b +�uY��X�M5W�o���顺�z��1 E��\`�/}+�AJ�n(�np���cms�+ d_.�V�4 +�~c�Jf����6�f�z&$���&z���Ȯ������!82*��O�gQ��J���٪z(����ۼɻW � �4��*�#���|���d���# +�h~���A�"n�ke���Xhinef�Xm�j� +�>$�Ϸ9H)��uU()ڲ�]i;��f��@��} +�� L�w��C�e<���A��-���*1ZW�3J򛭧�!��Wn�f�d7�ly�� �b�T����%�-z ���2 �)Qw����Ƃp WYKWz��q|*�:��/����]��/wrl�����]�6ܦ��� +l�BP�����P�}��h���Tխ�2�� +������A�������5މ���3��B5���h�n�Λ�!)(�� �ۨr�I�=� +�0�~%���V�L�1��|i�:������wks�\`β +���l�~�3�'�z�\`W�B��4��b�E��\\@�8օ�K� �;[��w��)���s� /��# �=�ܯ��RT�vgLn���D6s����S�U���|��'Zz�X��uQ+$��k�L�J�n>d�11�X��G�*�y�*P��u�\`> BX�� �;}��yw�N1���y����ӥ�j� c�C���, ށi�s��Z��v���|�͑D�s�z�~1�=��7��[.�,�[7+�LĠ+��rq���h������C�&�n�:�G�b�l� +y��~�$e�‘��*����f]E��P�\`�9n��dC$�� ���'M�\`��9��8//B���C� �B�y����^��������n+�p���sP�+Lu��z悹�g}���'������m^�o�z�n���k�(\\'�x- 5� +P��=%��V +q�Tk�"�RE�T��ŋ7i��s����3g풨>�,�{.�y��Ľt�����g���+k��R?P�_r����˽�t~&�Ta>��5��z ��Mu�W�)̥)�O�i�65�~ݭZ�v�����ʈ��9��4��1ΰ�L󥟲 +8�ڸ�*0(��C��n���������Cb�炑�Po[n�{��������G���]5����1��gJo��k��g�D��Ml��7�f߮��������4w.��(�}̴<̔\\o�sV��s�ȼ�I�u+����g���\`��Ȁ�0 ��N�[|"���|�C��;���U�u9?Z3Y +�J�m�ne�nm�ε�5���CG^�� ����]Θ�$nct��Ә�1��oO�o��^�h�����4��@��񐹈���$�3�}��'�#cV{�m#�r�J@�p�i���t}�jC��x �&�>L+C�!Uȃ{��t[(���J^~�R���i��<�̺�^���I��!첬K�p�P����)TW� +�"�.ܦ�DUM#Y�аI#Х}�D�%;9��i�pC�p�@g.�� +��ǎ��kk\\���' ",?���s�1-� +�)�x�+�$EK�˶!S�sTx3�{�ߎ�p\`��5Z�#�^䱧a�_�����߸#� +p�ӶTL-A��]�TC� �Fu� + �w:g"��Y����.b��#�\\�� �xeq;��(��&d@^�/���(�B�(��{�r����!=��y�����0]�z���=��{�ˑ1?Ա��|�-=bO\`*n֖����U��|��;_r��cB�Hd3�p���$��!�^�����.����6.����&�ԁ@�J�V�Y��@+�b�ڱ1 .�mū"��W݇׌�=��ϡr5���ߏ'��y�J��$�XI���m�e�!Q%h Cu u��BU��4����Z�PE��N�l�2q�G2�!&|S�~:&�s��=����Q�=zqh0 1p +�GV +EH��)n<�+�t��~4���:�ܷN��NzP�*�հ� +��m�C����t� +8�h=�/=d��B��(p���j\\������Y�9������ +������kq��Pd;��[��PV?��1,�K�[� �꼁 +�i��u�I7]#��xF�,�;��S�$k�D��"4��M���x5�>)~�n����^�wQ(�iи��CZz�����h�^Q�W™�%"��/w���jO�����~�e#n��T��F�a½�E�*l+� @I���2�e���u;ԛ�9Y��y�jr䖾nA��z��\\��Ʃ"��� +%��(P���r�>��R����g܄N����~^���|��,M�2*����l3U:���=,c�%�jX�FL%t�}�a�I⨹������ b���AP�R:i# +�.*qY��R�n�:��( +���A���N���ݗ��[n�jC/���U5��-)��҇D�9�I�{(��ae���ƇWH���m1D>�qe����D����0�����5~%����8Y��Ea�/��'8g�Ih�n9B\\�i8*�C�^��K�tp����ʣ�$��.n�Mw�����]F���CX/)j�9i'�لEQ�c1c}FNg\\�>���*S�sױs���\\W�2�+�aʀa��\\ +/�L���>�׾i|ݔ�\\4�k���<~�xI��w��mEǸ�ĵ�(l��U-[9oix��V�Ix�4� +���ME��MC��Z셤��S��n�����z�bmAB���E����m���}�Gƃ-�J�5Vy-�5��Z�3��>>�a�Q��D�̗e�T��)E3�����0Sf}ǷIbM�ɸ+2�>�=T�]��0��� �����t�h�.�* N>!E���-<��$"��7t�<�Z�����g*~��� +�Dv<�o�k�gNh� �ȫ��!��{�ŵ�D�>���n� +���=��O_�C�Q%E⸓� �����5D�3��p_����,�{}� �_;f�NA��(��;����z����M��C +� �G�[&C;���E-T��;�/�r�RTpK>��yq�>\`�~�b�j�b�� +'Zl�sr�\`�H,Ѧ�����C�dқ��s�� �����A���2Pwi~�^t�XLW� ���Nh��� +��~<_jEc��oy������W�; ���S�I�� ܔfVA��d6�o8uz�P����N ��0����.� +��� ����+Lʯn@C������f���Ö�'�_�W@w��"L�3g +���B�@@��[w �Sڣ�^&/���W +��?!�Cs��+�K{\` +���2 +.K���pA+N� $Ӏz��W@&�� -���NJ�\\7r�REv*��!ϧ�<ީ�=�.A�Y����¡�KG��k#wTF�@DNv�m�����_�.�^Э0��-��c~�t�Ɨ�B����u���5���25��[��i���� ��@M&C���n���)�C�3�ߌ-4^P��y����粉��w|B�O"*� ��_�q+��+1��Ui{�B�ҝƊQv�Q��L�C��Ő��˗��0�b�O�+e%Z�M���:�uj��3ԔmJ:1�{>q&�i�׶�����M#��}ws�7�E?1�a���܄��d����6�^:���L@��B��iZ[���݉��4�2uʤ�bd=2$�^��C�_۬�x���1~u$�ߟ����!܉�^��d��C�Iw�͆�������v�����X +�-F�b3�f@r���ŞJ����~� �K�-��-�l�M����WYF�m��@� +KfG�{e�X{M�nc8��$�J�5ڼ�4S��$Ua5�8�7M�Ve�;,�5Du��vq��g��a����VQʋ\\��*�䲉gBx�epXF��I�/�$���H_jÄzl�Q6�幰2�g^|����ZO&�4 �� ɛ�e��Ú���Y��ɛ +% �|^][-~���5����>����$n��{� +|j� +Gs�����o\\Y��2�#|a�v8ֳ��x�{� +��/�H��I�^��z�d>�nr�t�sU��b�q���)Di�7E�d���4�΋㏾?�����/m?�>��@����T� +���)dz�a8����\`p�|�g��a�� +��6������\\>���V-��@�I���vGC {�3Vh]eA*��[X���7#����y��;�$N��a +�0��w�����÷ݡ�_|���W�����ݕ������=w� ���I���r��̀�ы�:< ���+\\>�v�-�V\`͋F��Z�Qn��!��r���k�unZQ�� +�b�S�����LKw~��3�8�P�$2$�w�5 +�"�e���!�@��c���T�5qA�,1?K�Y��߽��i��|��W���$�{�_%�w<�v�� � S��)�,ۆm�{���A)�=�*R�cџr���� �A���z<�p�Φ�����D��ؗS�u�����v�^��?s�5�=\`V3��䏾�ۥ�.�j�����s'�6]�d�G�]{+ى��0�"p2�n:ڙO޶C;��Q6/�77�E+�|��x&��rִ p��k� UI�U}�a\\q@�D�ª�Mc2 ��{Q��M��WI\`l�����e��-��v���S��T@���?zx}�ԑ=�P�-m��}�m,L�N���f��M��� �$mfL�/&!j!K��G�$��������}��OJ�T���a��=��� ++��W��gG�@f�#V3BW���*ex=�����8:21�D��<ӳ����=\\#�߽���ԃ#�U +�'���O�e�?��7�WO$L� +�� �^hW���k�:QU��1�����c45!��=���d��q��Q���Q �!�N|.�|V6�.D<�Ј'KǃzG�α��(�V��k�B�� �w�qG���f�?����1��_�]������ߖ��#��߾�.?҇o���L�5�l��\\qA�_a� {b�9wcJpQ�7�4��r�AZ}g9R�Y������%�D� ���ր���lm�@d(ڛ�e���6��B�������&.��keX�Î9 ����n��I��d6,*]��ۖu,���4��M��0�z+ +Mx�Z�,�Ýc�����~".w��p��H^����q?��P�+t��MJ~�-��E���6Кۑ+� ����ss|Q��E��k������/D:���G�r +UB��?�3r�O]8y#>! +���?4m +�����-�˄���� ����ݧQ�0�̌j��Oꍼ�(���I���|�v�i�,�wT8���� �YF���*lE�,"��pl�_D���yz%���0����-�F�P�c]��P� +�(��S�TP���+X +�I�����dG����E$u�:^�po�����n�C�0Z��h �4D�ArH�$�\\b*�Hy�:b�WmV���b�<�B*���@�ǹ;�؞�|�b���W;�h�^��3�����F��{���q�B�Zg6<�!�PDN�X��w>�YF�����Z���W��3acF�oZ8 +�/�^�꠫Y�����:\\�k�����zy��‘%�LA�������3��س��&�kIQ�L˽U�E�K�m ʄ�Y(ʎx&ؗ�'�́�V��t:�ৌ& J�5�Ji�w���֢����8��Jh�l*���6w��X�ۥ��5KRxE��N$�8 �t�:���_2w�x��Q�?�m ��oF[B.�)�!:���^! +|q�5��$��3��Y �"�c�잮�]��<\`��4n��Dr��pO�ANݭ �P�À��?t&��7t %�Pp�'��t,�T>�߃�/����R +���"�gcz"jS +ȇ܊���K�lFP/�1�fZ�T�!T����<]�7\`��χ6��� +oZ᥽D��k�q���z׫lEqy��3ᐑk��E +��s���~��#�H���[��JY0�h�Ȇ� P��e�SzE6�DdȡD�ѽQK���~1O )��sPS� ����u�?G���ꐳ;H�\`��t�N�G�N�-���:%��"��xe�f��&A�Cu\`�2��B���ޢ�*t��9TqJ�X{�#y���S +� ��a�խD�}�#{]h�>%�+s��鏋���z��{�0؍��#to̼�KTq�3 �B�C$�f�Y��@��[�H +�����3L|�e�����12y�6��&���=nÓ���B/� Ƚ�}��á +�~� m�V�mP�2gǕޛ���=���a�L2�]p~���|A�itij9KN��� z�{ƨqJ�<�D�Q� +\`7ŏ�/��<���z\\��Mܿ��σ��5���ߘ�T����;��Wp�x���* ���½\`ihCM�c�ɎF$J�w9�G�-}�����~���'�w�i��_ϝ��m<_��P��Y�ވ>0�R����,�=������W'�Ap� ���]T]�3mN�8�>���x �w�2�=8/���4��$���o�k%��^t�(\`�;�� Ԣ{͜��8GZ�s�H��������_��^>mC���Z2��D"��TȠ��3u�UPt# �i���҂�phܧeo'���sP���<i(Q��.G��읃7��r> +[/�����b�_03M��d~�ʌp]e}u}+�v���a����L)4��@�K�ܽ��{�q�X}:"�/�t�ԁ0<'��ç�$, ���nH٢Rx�� +{�����RV}��4�4���t?���7�8��C��J�Cg”�(�n�6��i��'2�wA�Ej�I18��s��:,�ǟ��/X%��G��Yr��S��4����ώ���P$�3�"��=_�11�6���u��=5j�_^��w�NBx9�l�ʭ�ᯭK+s2�]�����u�Hf�%��%:����ܚ]�Ǘ�����-�1%�o��qdR(��Qh��0"����� +اj�tج��Y��a� +���& ��;ᶻm�>��8��w"�cY�R�7�Mڬ�9�>@ɶG��q�p�MC����&|&,��a��a̶�Y���<�÷������,�X��ju(Fq�!"�}����+T��V�ZK��U:�O�+s���Z�7I��-��_�K9C� -{��.���}��u��&Z�2݊{E{P�P�����J}�8 5�N����l;V���7�S�.�ez,�eA21��AxبUp^�H��0�Є="ϕ��;���8�� ��6\`���ulZ�tN=� +�x-�4Ε�bŭ����T�$X|��0������{1-E� +١�V�_I��Y��cBu�'RYT�Z�B� �/��)�5�7fbn��ˬjo�Ǩ:���� �#��Tʊ^���t!�r'I�TB��í ��l�i'+� +�zbDuF�;ŧ3 +p�������Ϣ�{�jg�}F>?��l-�����}A.jg�|�"� +���T'Vj��0v�r\`�vvlɽ�[=�4=�4��s�h���)�O~�&V��_17���E(Oj��?���� ���{�|�� ��� +-���/�d9�>T��Y���3����F޲=i\`�j�j%ӡ��m �Xw7?��ᄐ)P���x%/�ԧ�r�<]�e'��_�F�…��zJ�fpIp1�w� +�~��NΠ��Έl� }\\M���nh�v����>��.��^��n"�����/���w�$�ij� +6�����/:��H7�0[GzmJ�Qy��^n���N?헢����2>���� +)��5�#=�и��,dΨˎ�ZR���v�l��z���D%���e\\5�)|>Uܢ���o���3�o=��s���a'�B9%�5uUe5za�˗� >;No��{4����™��4a��obN��[�g ���i]�u��l�s��� +b��P$�;L�����;}m��N_�?DLAy�к���<=����p<g���h?~����[���q��3������W[�0O'�P=Ha$+���}8�%�})§5�\\�U-]U��'���1M&�4wOn�����G]zzg��Կ~��vx|hf�i��™��#v���?�ꁮt�RUI�:XU d)FJE������ +h���3ʠ��|^���qL��?ϧSx�F��u�틯=v���{w��(���7�� ��U��Q�&S=�FeD +�0�T�P�d����C.G��R5�)�G��� +��u�G������������@��U9 +L�q����W��'>�)�?��zY�Ņ9�� G�Y X�@u9Q�pq�8�0�f�뼌 +� N�/��c����z�^��xC^����W��c�p��_��nq���˭�6 ��X�+��C��9?�=�� +�����Eb���͹-:V9M�� �C2\\ �� )�����&f|j�fӑb��t8,GK������\`�_��� �O�#��c��JH=���+��{������6 +�� ?��Gs�Q��S*�� �w�i7L�D1��.���ۻ�z��z���$dؿڼ�!4ٺ�Y]�����y �!ʇ_;�RX�o�zQ��� a_֩fm=Οr��,�q����N�Ƹ�Tuj�b����>E(������nX�a��n��r�Z�3��w =�Z���C�;^�hk H$�T-V|$[i��"�"R�hx�g�@E���w�� >� ֟4iz�^��Z��ǟW�;Ɓ��!V�8_�o/~q�8y�r�X�!�O���� +W:���r�e�N}���s�ۡ�9D�!iM��(���-ѯf�RÞ�P$f>d�� �b����Z"��+�Z{#��v�h�UÛ�&L 5��S�9dB����WZ���������C��}��ݓ��p��z��KFm��X��H�� +vL0�_E�o���{k����!��X^��X�P��b�@����@5�,M��m��(�*���M�\`�F�@�i������5���o�׳�amD0{�^>�����Y@���ӓu�}��]������Ke�Gr�t{_��z�_�H��c��l����Cc�ݝ��a>z���\\r��V?\\Z����,��2[]EY�ʕs��ڳ�n�_Ep�k��F�qׇ�.��m�ȕ��n>��>�o��SP�9�#�9(�#4ݠ�Ŀp���oߝ����'�Y0u-��(��/��� ����"k"�hx�d){B�# +BLX݇��;�"��'#�©;|�'T�a\\��s�59��*z�h�)���Q� �("B��3���O�\\~���/�0T#�g���9w�p�>��5��P=r����H�9�r�(R��ɧ��p2��v������\`�ƕ*HRt-,8Lz� +:\`:�1�w�Ö]�a��P{}䄊.��8_/�����u8��+��Pl��Q����A.0�ӣ3��m��5!��#�*~ofF{s��^�=Je�b������\\>T�M���4����X�����9T{q�w�mJ�N��=8\\�����~ e�CV�&�|ezL�! %��ѫ�W��3o��I?��@$�!iC���%cF���& ��[4dM��h��(,�Y���%䆯��m��h�wY�?:����6^�P"hU�᧢���>k�"���; �S���\\!�N��b~l�K"�|rp{����u���TE��V��Z8 +��6 h�)#giI�Zf�zU�t������A��������Xب�=�|b&���aV�ʅ���\`b:������ˎi����_r፰�[����z�ũ��R�z���@|���@=���J.ȣ��u(��E?��77H�吶��<޹wƏ�����G���y��Y�^� H#1D6�N�Q8�z��X�Zl�޺R�3a1��:�xu w��Z<�]���W��B�Ԍ!�et�ۊ&)e0�q �����L9��w�NŘ�0��^G���l���Z\`�����3���.e76)�YruI3�� ��r���p>�۶���� +|����-��L@B�����&qc��R}�D����=1�I�}R�FbD2�d}!~q���5���^���n��>9� �m�g�x���*�*��gx�7�pnIp����kwjT�}��g�z_G�Ջ�(�,�ˠ-��)7mh�A\`�P���- ��7�a�T�p[����T��2J?�r�kqz��w�t��� @��M%� ���;G�_����*��8�᳦]��h$�E94�!Þ ��i&^:j0�'���F�cѫ���(K�Rlİ�;$�Em��X��&w,�.z@"D�v�3�]*�7=\`�tw�/wg%�S�:����3���K{d}n�u,G8�b*�zU6z���!��2@�d�eN��x��*|*�v��H24mt�iK�wR��@��ӴW�\\N��Z���:������ni���.�Nɓ��T~C�����lDž��8x����q���!l Lт=rugh��O�Fi���aJE�*A�m��jB��GF��[A$4�� � +N7����p]��T�����1�| +V��²@BQ��OJ[f�\`�����b.}�a[�A��@RH�Gq@X�p�.�K�(�-b spDfβ\\���7��7�Z��K~�}�8�f��d\`p�Ǹ �-��د�?aj +�A�bK����7����p ���pxz����;���}y�u$�x�� +����ӂ���3��Ui#��+۵�[���\`�������������t�_���C��M����My���\`���*w�YZ-��#1��յ��KU��'����0}5\\�vW�R���8&�@%UXuO���_QYl�=�k�7�ɑ�>w>�oz ] {����� �HJ���:����(��v�c!�lEy��^8.v\\�At��N���O�0�p<�����r@u�&���,�@r�@U%���a� ��5_� �qS��S�՜��t8��Q^�����N09��>�����_^��f�.� +�檻k��(��n��G;�bFO �'zx�($z�qⱦ2-�5x>� +��,��Pv�\\U��km�] +��.���Z�6�F���K��*���3�\`W�/*���9+���\\��^'f3(��!.��۪��"G��i.�~髬W�k6��P��lx �xM��7u�d;��� ^ZuL��&s���|r˞7 + �q/V��p�l�������X�P� 2�cx+�SC1i�#��S�W( ����r4â�A +��=O:��\`�|��|&����,B�m�:q�5�g��4���W���}�{�'�v�C�\\â���ߧi��\`O!�s<���-n�J��]� ���s���f�o�K�E |(w��$Ϝ0�9A�m}c!��ɦ��L�H�Ap��ΐ6f���D-#��1 + ��ܥ��q�}xy�C����E�M#�D��j�Tq��X-97�@�M!Dl�0uANIf%'� {���[D��n�K_� +�C;�v�P3,=&�����P��=��Qm�(]����p@�2w�\\�K��N,��v1t����i��Oj %؉��W�]Y�'9p7�^�nBM��~� /�F��ɡ����7��Q<|g���\\5J8��U�f��E��^#��0cUN�d����]u��C������.9�n]9��ur����7�];p�f��q��/�ῲ������K�" +"�e��\\�T�]�9=M�f*�o&d���^O'��Ԥ)��p��]ѽ���֍!��ޢCDF�4G����p���h��ʌG!�o����8E�g�!��Aʹ�������Y�Ǫݽ�^<"��-)1�,J�oT�Hu�r8 +�%92�<1� +��;�&<�<��t����;_��s��/�fɬ[� +�h�%c��u5�4[n7gp���g\\��O'M�i��N���Ӆv�ty�e��{��x> �F���A_��)2��t����p&� �ɱ&�W�'驢� ��}�c.�� +Z��������S������QA�_[���-���R�v�HI!^����Cf0}(/Ǣz��r�sa��)��B�%�؟[m��&��j�a���5���|������z�R&�����gf�@�O@x�.���� ��YA�����+��Z��D� � u���{��dB�39�7�ֹ��_����])i�,�J�?�(b �ZPzD�ꢤl� +{ZOKR�4�� m��9q��0>���a�����Y����|����S��W�S$^3@1r�� +��X�]h���������F�� %�ӥ���}��i��O\\G!��U�n��|�%)�s ��&��/��LX�/���[VU��"�;Q�xK���������Ñ�> St�H �N�ӏٯ'��f��]�9X>�ѧI���l� ����)� o�4�Iw�«��F�m�g)�)�?��d����W#]��|ş�� S+"/8*�_B�&��#δ��+ B��Q*&��ω��00}��|"��S�j q,m\\��������tD�}�B\\����z�v??�;�������[��~7�����S��W��O�\`��_㏮ƿ;�C�� ]|ۡgS����s��aA����gw�c�˛N��7�q|q����s���̽ï�X����0y�*�����z8��R��Hx����TG\\��9p��7�Օg��]�}���7���_�:,��3�w���X�u}��6��/�]��b�Gi%�����#���,�{c��4;:Y*;�Z\`�5��;��ĥʡ$ϓ��� +yS���+��n5*�w�UVl��ǩ��D��{D]����k�<�X�K�Bk����jFC@���4���qȧ��y����%�p�OE�7̔4¿��� ;��1fK'(��p?���C:�8e;>#wj�|�\` ���9C���8��|tOrݹ�J�ls^5�#p._�����3t�V�݂��W" +|YAW���]ÓI������Z�J��'�aׇF�A �M2՜�d("].� X?k=� �-����S $��+��,,���t6q2g~g�D�/P�R�WK�o2W���XP� �j��*�P�:Cn�%�$�&U⣜��Q���k�M��'����uzBF(�Ϛ�ijqq�lm���r�p�g(�.]ѵHӐ��DG��]Eћ���,GJ +�B�]���C �S:��_�� =�4���w��*{�����D�a��޲7�}gG�<����y��f�꼎z��Uǜw���s�E����p�恴)�����29�*�[�:��3\`��i��hO�y>�dY�:�d�$�\`PyXtkP���^�Z��f�)��[Z�ܘpG�-��u������J�x�N�GSs0')Htp���H�I4�n��h� +�����4M���\\��&������\`�场��_\\���Ԡ� ~�b!��dgj�v�o;��&X*�y�I$E�+��et��]��h�A���@E�����͑b��*�T�c��‡Vf(��f �R}��B�M���(�������&T�VR�M���4� �=N4K|45���><��͢1@��Ǔ4��wޕ�Q��J��o ���Bj�ty��;T�� 2�7H��'ϲ�A;������2��5F��q��aH_�yG��>���Ҥ�1���8�Ә$+O)^<��X�'�����.�(_����E���a��n�̵���fLg��i�M�b�Eb�[���E���g������Bv�AY�P��~7��n��U}�����0.��v�d��Rf�R�P�A�޷��$@ a2҅�(�8�1� �S2˿���Ā��= Wu0D'f\\��^��jh�� +5V^덓!�������^�l�T����n�y���v~L���8�%H���)��RW��h���0ЦA�}�(zy=����V��a��/�߹%N����g�╰%���@��<�-�殔��|q�Tݣ7������B�fe��;*��>�2���r���V|�m�1���(���Xo�C�h����pQ��\`%j=��\\�gmf���Z�h�7��r6?��T�c��,�����LP�>��xP/�U����Fθ$*}�۳Ml�R���ȭ�]�or]'����_��-�C��!b��� B=e�z&\\L�/����_L���c�ӨsF�/�QA�w�����4��n��(��� +��e��K; +v�bvf��Н�|���.�!� �� +/*Iђ�M-y����&1#pð�!�S�_��)b�9�T'��/h +�?~3���,�+�i�*�GV����Ɯu�|���N>2"a�^���j���8�����7�,l|�ա].TX=�No�9��Q��=z�uI����†fr����}1����ؿ�گf/���K����v�#3H��RB�lP���V�}��.����O>B�1�@�D A�����8g���$0�Zz�s�X��8V0� �v�� VUn%���~='X &;�MF ��g��u?�ǿ����9@T\\>�c��M�z��j�ц���+U1ˑd/����W�6n(.��C�������ځQ���u�۪ju�R��޷�<>��j�%�rY>�Y;�?�}���_����p��\`8.h���A]�#!�Hɒ�I7�(!4������_ 8�Fw:��M���~���(�S��|�o2Z|}�ߢw�s���j��&*�# ҋnT���U3�Nʵ%�U� +�'��5:m�&���Bv��v�=�Q���D��C_��k�k�&5O���'�ӫT���'����fa7$��{��A�S� +��:�����@4m�a/0P"n�9�i�U�~�u���лFB�!�S 0U 0�MY�)������S?Ĉo9�4�<0�J +�Ǚ� K����r�;�-k�m ��D�x�ָnQL�e�-��T�h����t����iQ��<9�Ӳ~��h� +2���ֺ}4Lޏ�#�Q{P�ß#^�͐6ZaN�R�zԿJe�&q�)�ņWMN �̳�+ =�(�|����7�6���q�[�ą�"��2�e�¥3{�X�S�Mi��'��+"q$$]_qFU���� 0�H1�8������3��!��n�{Un��Ԩ�A���f�ৢ%�K'X]��4�#=֞�����H+}Y�| ��Ʃ��2��ixᕲ_�C+6��_�hݵ���\`�M��7ե��po�&���(�KP�*D���k��6�-9�.��5��p2�‡��!0�*�z���������A��T�d�_vT�hmm8�Y��^9� &c�h���";3B�5i��ڌzd���;��]Fd�� �1�Ps��""� ��9L(�Ƒ�}pV�BkX7�v&o��S�!&�����uϠ��s��>�3Z� +�[�!N?�(gZ��.2�96���� +E�?]ث3�m޸O�_�zQl��g~����.O��*�s���p �)�N�y����E�w"�q���+c�5���g��s�E���DO��� �%Pх1D�& +�0�n���֒J�)!�ҋ�����ޡ�&�@ЋZ����� �n��;u��{,\\q�,~�"c�M%�__�N��k@�sM�N�%�a����%F��V���i�gi����n8y�ِMZ�E��gqP�SW(��gw{�VB~O�:WbH<[&��~w��O�+�E>͋���#�3��<ˆ���'�9򽑷@|��= ϏO�K��Tr��!%E�Ec�Z�0�z9�[Y�%���q�ܐ05��r�:jn���;������&,?a��1s�3 +���� ��r]K�R�T0��w艈; +�Qv����1�M:k�����uz;�h�����1��OBp����\`��EY�3#���R�<:����D�YoY8H��:�]>���ZziX��:�LC��nd:�-����x���Dk78U* �4�h7D������]g���kY{����:��.G,��A����ceb-��^Ô� xsʀ�Jв���P'���e텔Sp��j�6�k&h=��q��)�4����&H��y�z'd�����L&>\\:Q4���n�0��oО\`;�_��qҒ��ZO9��:ޑ�\`R�Ӧo������Nw���[�?·Qz� �>R/}�s����I���f��r8�Ȩ&a�wTfh�αU��7�Lw����U�� +�-4x����2"��~�V��8#C#��]�����U��)�[���fܤ���@+�8��hIB)�I@���4y+��-��O��{���F������nO>��"�o���9������[��p_ + ���V��_? ��}g�ῧ���7���� [~��'�7=����?�I!�1Ɍ�pZ��^���6������{�t�c�?���CȨ��~;�����㵹��ШD����O +��]Kȉx��F#�,&���QnvT� +�;���(�fr#�_w��ɂw9:�q١�I]�?���1\\&�U��\`)�tA �i˄H\`ZZS1���4�_� +�U7y~7���S�!I�=M�]D@S����Y�6�d @�ĉH�U4�bP9�L�ԣB6X1�n���7h�C��� ��ǛX�Fx4�otLy��.�K����Ru0�W�̓t�L���]Mc�����x�Sz���g�7]�f��E� +jR�HB��h��9�C�jU�r?O �}������Mٔ�$��)���4-3�%ђ�'jRA�˘,G���� ��H�i�8������ ӘM4G�����K�z]��3��5��~j��{ +��� +6+rdX-�@p2_�_��+*zr�k���x�ܴG=�p�X� +�T6��4��E*�s�]�^r�[Hl=#����5x +s o�ɥ +���f������h�>���UI��c�⧫�KjM/�6��J !����#7�� �6�������a���U��3�� ��?������a�;/��w�,}o��}��',*]K�zzOQ�\\�M1)��'�+T��nj�\`���Y��'DFCq��z��i����h�0ĝ���1�Მ���rS���D��y�~���6;��ct�֢�0=�\\����lꓡ��(>�>�����fH݇��o +w��>�߀�,?P/Dp��CGp�l +cj� +fÍ�u��4��+����;����}<7���L�HmHn ��*�� =l��=��']d<��iH\`���Sc�����WƓ� +���ש���) 鋠H��F!}��^a5��@�W����L�h�#�g�� ���G99�oѰ��:�̾iW:m�>_U!ty�:�r�u(^�b ).��.((�7&�{���K8�dw2�q�A��8'N���&�Dy���<�B��\`�Ţ���V-��h�.[Q�z��Tb���������g{�7� ��=���\`�Η6��.l��A)�D�ͬo]�1ˬ� ?��!�ʴ��8��MR�{��t޳������, +�sY���|�}�] j��OtD����x���侸��u����"�t�A�8k\`Bc)/�>���vc XT�A]���zw�J#-��ހ-Ĉ0}�I�o� )|��0�oCI���\\���&m8t������6ܼgͶ�߿6,|�o�$� +W��(� �^��7&21s�;&������K&Yz���Y��6����+a��U{���%r�1k"�&Q},��1����0�3ϵ�9�m �:����g6J�/y�5N����\`�7��f8: �Q��c����98����5g����r�K/����[�a��y� �b I� +��d�������� �n�Z�p�e������̲o8&�4��7� ���й����/�/���#�u�4�;p�)�:�l��g�e����Q\\�1J �'��������*���E��Y�r�ũ���p�]����p���2o#J­ZG�S-C�����x�\\����Ru�|��� +Z�v�����ݠ �����fq2x�t��c�n�ܝ�x0����L�%����E�v)�q���y9�V[��a/x�̭4j�^d��]jy�Ff�p�_�������X6���� ��|G�{ �N [�tw���-L2�3�^<�ü�� +��,���Ig�Ҙ5�YkU(��;,�u +��\\�ٽ}2>���o�E��=�� ����^��m<���Ԣ +�����j+W�B��a�j��L��R%��6�y�JT����P������s�ԏ�(�"33]�� �8V +XZ�l#��Me��\`Dk$�.������J���f��;���d]N@���hՎ�"m���ۇ�����B��c �M��o!p)eL�ۀ�>qL''�l2��?�����]�-��D��<�Ê_n����%L�IA���h;����|+�b1�J%x��\` +�}|���]n0��b{��[8C��F���j5nd>$Fn�l�V!IѼ�.�F4���/��i�����}�.�s.h�BG��](�Q�(�87ɑ��Tr�f������7�F�84�2�����z� '�� 9��>��y:��1ԟ!�^7���2h7�A� +V�8_��3M&-t�a[Ɂ�CTT(;feOM:���P�w����l���q.Zz��A��~�M�Dg%� +x� +Ô�b�/�XN�C���_�Ѻ/��狁���Lg< �Z���|"�\`D��5, sV����Z%�w�)�\`�7��w3��z|�G5�ewS��0k����{�G��9��+E�v�-�"�uu3]D{���g�����j0����Q-U�uO(}0d��c6��x�+���؝��baE�->@�Tœ�[_�3����\\9�}�}u���o����z����f�Y��4�G���� �q��$��]�\\�!�}��%$I�1�V��%U^�nt������?� t�>����^|���&xJ���F��e#��{�S5��s� +-;Y:���N�<#��ti���0��#~!�yyf�~���83������0Lku'�#s�h2�+��L�<��� ��d/:z��1��׹�/����U���8 +s�e�L��ԓ��2�"�J.�Y�!:��l.p ��.m s�~����a�“�$3�R����݈�\\�=>9G[�W� ���a�I�5fP� �!������F ��]z�9����\\O�-zM�Bc�P+ #�K|�!lD�#�s���;ﱙ�?�^����D��G�68�f@�, +|���d�*���iQ��Yh!\\ �z���5n�d4��z +/�͕r����H-�5��&|�54�I/��Qxs}�B�3�NZ���� +���Q�OJ��bw�����WO�]O_���uߗ~��j%�\`��Wvo3u��f�э�;V��\\\`n�X�#�U���g������(~����K��K,a�:-�� �����@97� |�� ��%�N4?M�|CC�]�>T<##���wE��e;��\`�x�[�߰١�I<3����q(������������v���;������:&k�̐i�m�Dܺ�� /�[RfjWP _�r=�!HQ8bC�+��� p����+�m�?]}�ۛB��G��ެ�~���ث��~�x��'_����#A��6 �5�I��u � +��ZY�מb�����-�@U��Sφ=g:���/|�q���5�a+�S�#�����]�4 C�: �=L�}�~k��&�2�<�Dž���)����w}<���W Ȗ��O��G +�%���u�Ҹ��8�#܄~.x����k��r���F�˾G��0�Azt����Q-h�A����e��pK�m��(��q0lg��p6)n 5ߋ$�x�d4@������� &C��7�� [z�8�4'�x7�e���+J�(�9��.�h����i��r�w9~I|�Q�����7fe�y�=�����x{Q3��b��>�Y�/��B'~L��Ё������@�� ���{���h!� �Y��.�L��p^��H@�<�Uf4�*r�������E�-����ѣ���z�Κ����o��8�!f��;(�� �lf�xSǠ�ųC��@��pT(-t6Q�#�hf�� u��{+�t��� +�jU'�JV�#��5$�8���w���[�H�����C=~�x[[٥ ED�j�B�9��j�������>����a�� n�!F�+��#~�7�� � ��p������Y] �nn��R��?�}�s�9� �����>~�͏����؇so~������~�|�ԛq}�*�u�XY4?%秥a�I����H���tA +!�>��@83 +#Svv +\\=�s���;z�0� � +Y�2%:����:�@c�{�x�v����F_Qu�aE�V��7�>o�χD�]��j��^�g�<�/��K�_�@�%�0���G'�������2��>ԑ�#��M�:�)M(օ�VG �h�]�a�y�\`i3ɩ @+�w��ȼ���2�Q��5��L��a)٢����l9݊��%*���qg��U5�����Θ����l���n+�@����@\`�@�蔠ی�.����������7"U�}h��7�Ͽ�|��9!���P÷�HؕT�(:�ʰ�(a��2M�6�$��0~��9:M�a6K��Z�����%��Z$A$ �}jǢ��w���̠��ea(b\`�iS�\\���;M���8��-qb �8� �� +S���<˻�,0> +B��6C.H��t��ș�\`���8uI�?���A+��������=� x� +YE�h��F�H͋�(n S��S�ޅE�j}p��:�<~�G+�d�I.�29U�ZrÚ��Ȣ�:��v�LjIlۧ�Z���-򑕎���A�ҿ>C�GF��T�����B��=�'�?A�h�@w����)���j��vB�)+������{�u� s4Q�l����T��jRPCz��6������뢍+���a$��=o�m� �3���r��%$^;U� S�(��G��,vQC�JS�m�T�8�5= +�ɫ����������{���g֠uG�̭F��3�Bjp屶���'� �Kp?l.���:塁Kt坡�#�nCJ�"�e� +uyL ��✴�\\p��#����c:�rg�����Q�@��r3��D>���4�"rl|���� � +�_t�� |B����P�gW����aq�0X�VW�n�VCvɷ�u/���1 y���$2��R�LI�Ӎ�#��8E�M���Zq��p����n�:����T$����z��B96.)Ѣ�̷����Q)dG)������J(N ����C ;\`�W�?#K6 r��˿��G��;ff��N�j�{|����U�=4�;��F������m?�ێ��_�/�O� ���|������;�͇C��ݺ��Z�qU��ڠW|$���ABH� +����D�e��Tޘ� +�T�1F����HG��B���������,B=�AI�ʅD�$=Ff�7�Ҹ�Rj&���C�fjl226=�j���'��pg�O�_�v^zK�n��0�#���8]m�8j�[���r�@%$40������g-��3g�R|�VKc?�5~��ޠ3Uw�V1�*��xq;�ύl�_��]�\`�21P��m�{*\`1ő^:�rȃ(�[̻���P�� DB�b1�?x�����)d� \\��y���� �h�k�Ň�8V*�9�$�g����n�?�I�g", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--objects--d7--63ed0695481fe3bc6da377e0d1897688ead824 1`] = ` +[ + "--contract_rs--.git--objects--d7--63ed0695481fe3bc6da377e0d1897688ead824", + "x+)JMU06c01����촜��b1��~.���Ȅ#׏�d{�7�& +=f�", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--objects--ea--8c4bf7f35f6f77f75d92ad8ce8349f6e81ddba 1`] = ` +[ + "--contract_rs--.git--objects--ea--8c4bf7f35f6f77f75d92ad8ce8349f6e81ddba", + "xK��OR�\`�/I,JO-�&a�", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--objects--f7--d3186b7d8ae1efaf7a41fdc2c54b8e9710fc99 1`] = ` +[ + "--contract_rs--.git--objects--f7--d3186b7d8ae1efaf7a41fdc2c54b8e9710fc99", + "x��[k�@���_1�B�V�KiAP��� bl��-�-BZ���׻�^�$������$/��9��̜͹�a|���+�m1��(��r�d%�H�\`P[�S��-jӞ̾F�wʥ���h�K�-Q���5����}����Ri��x� +M\\3�����g���J(��0�N�4\\̓x&�2No��u4�N'a�X͓4�@Y����P2S����������kKM���7�_�w��������0J�t#�����H��ĭ��v35L +��A��y;(�H�q3�,z�]@��@H���p��2�֗��p݌�7@f�v +�u��ðTn��}�(�+t{w��B��Y�7W�x썏U��nPy���Չ�����ٵCw��F�~�!a(���p�hCp��dp6O��8�(p�(��:�K�< 4;�6�J�f峬�4���o�8Ҭd��yƄ�;�c�{�d������T��9g�Ӽt����, +ӛ�3F��G�;�F��<��q�e�L���(���Gq", +] +`; + +exports[`create contract 'rs': --contract_rs--.git--refs--heads--main 1`] = ` +[ + "--contract_rs--.git--refs--heads--main", + "2202adf5dd50b090722801b35b6f5e3c8353e29e +", +] +`; + +exports[`create contract 'rs': --contract_rs--.github--workflows--deploy-production.yml 1`] = ` +[ + "--contract_rs--.github--workflows--deploy-production.yml", + "name: Deploy to production +on: + push: + branches: [main] + +jobs: + test: + uses: ./.github/workflows/test.yml + + deploy-staging: + name: Deploy to production + needs: [test] + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Install cargo-near CLI + run: curl --proto '=https' --tlsv1.2 -LsSf https://github.com/near/cargo-near/releases/download/cargo-near-v0.13.2/cargo-near-installer.sh | sh + - name: Deploy to production + run: | + cargo near deploy build-reproducible-wasm "\${{ vars.NEAR_CONTRACT_PRODUCTION_ACCOUNT_ID }}" \\ + without-init-call \\ + network-config "\${{ vars.NEAR_CONTRACT_PRODUCTION_NETWORK }}" \\ + sign-with-plaintext-private-key \\ + --signer-public-key "\${{ vars.NEAR_CONTRACT_PRODUCTION_ACCOUNT_PUBLIC_KEY }}" \\ + --signer-private-key "\${{ secrets.NEAR_CONTRACT_PRODUCTION_ACCOUNT_PRIVATE_KEY }}" \\ + send +", +] +`; + +exports[`create contract 'rs': --contract_rs--.github--workflows--deploy-staging.yml 1`] = ` +[ + "--contract_rs--.github--workflows--deploy-staging.yml", + "name: Deploy to staging +on: + pull_request: + +jobs: + test: + uses: ./.github/workflows/test.yml + + deploy-staging: + name: Deploy to staging subaccount + permissions: + pull-requests: write + needs: [test] + runs-on: ubuntu-latest + env: + NEAR_CONTRACT_PR_STAGING_ACCOUNT_ID: gh-\${{ github.event.number }}.\${{ vars.NEAR_CONTRACT_STAGING_ACCOUNT_ID }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install near CLI + run: curl --proto '=https' --tlsv1.2 -LsSf https://github.com/near/near-cli-rs/releases/download/v0.11.1/near-cli-rs-installer.sh | sh + - name: Create staging account + if: github.event.action == 'opened' || github.event.action == 'reopened' + run: | + near account create-account fund-myself "\${{ env.NEAR_CONTRACT_PR_STAGING_ACCOUNT_ID }}" '10 NEAR' \\ + use-manually-provided-public-key "\${{ vars.NEAR_CONTRACT_STAGING_ACCOUNT_PUBLIC_KEY }}" \\ + sign-as "\${{ vars.NEAR_CONTRACT_STAGING_ACCOUNT_ID }}" \\ + network-config "\${{ vars.NEAR_CONTRACT_STAGING_NETWORK }}" \\ + sign-with-plaintext-private-key \\ + --signer-public-key "\${{ vars.NEAR_CONTRACT_STAGING_ACCOUNT_PUBLIC_KEY }}" \\ + --signer-private-key "\${{ secrets.NEAR_CONTRACT_STAGING_ACCOUNT_PRIVATE_KEY }}" \\ + send + + - name: Install cargo-near CLI + run: curl --proto '=https' --tlsv1.2 -LsSf https://github.com/near/cargo-near/releases/download/cargo-near-v0.13.2/cargo-near-installer.sh | sh + - name: Deploy to staging + # \`--skip-git-remote-check\` was used + # as pull request git refs \`refs/pull/NUMBER/merge\` are somewhat harder to access and live only as long as PRs do + # + # WASM reproducibility check akin to SourceScan won't be available for staging contracts, deployed from PRs + run: | + cargo near deploy build-reproducible-wasm --skip-git-remote-check "\${{ env.NEAR_CONTRACT_PR_STAGING_ACCOUNT_ID }}" \\ + without-init-call \\ + network-config "\${{ vars.NEAR_CONTRACT_STAGING_NETWORK }}" \\ + sign-with-plaintext-private-key \\ + --signer-public-key "\${{ vars.NEAR_CONTRACT_STAGING_ACCOUNT_PUBLIC_KEY }}" \\ + --signer-private-key "\${{ secrets.NEAR_CONTRACT_STAGING_ACCOUNT_PRIVATE_KEY }}" \\ + send + + - name: Comment on pull request + env: + GH_TOKEN: \${{ github.token }} + run: | + gh pr comment "\${{ github.event.number }}" --body "Staging contract is deployed to ["'\`'"\${{ env.NEAR_CONTRACT_PR_STAGING_ACCOUNT_ID }}"'\`'" account](https://explorer.\${{ vars.NEAR_CONTRACT_STAGING_NETWORK }}.near.org/accounts/\${{ env.NEAR_CONTRACT_PR_STAGING_ACCOUNT_ID }})" +", +] +`; + +exports[`create contract 'rs': --contract_rs--.github--workflows--test.yml 1`] = ` +[ + "--contract_rs--.github--workflows--test.yml", + "name: Test +on: + workflow_call: + +jobs: + code-formatting: + name: Code Formatting + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - run: cargo fmt --check + + code-linter: + name: Code Linter + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Run cargo clippy + run: | + rustup component add clippy + cargo clippy --all-features --workspace --tests -- --warn clippy::all --warn clippy::nursery + + tests: + name: Tests + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Run cargo test + run: cargo test +", +] +`; + +exports[`create contract 'rs': --contract_rs--.github--workflows--undeploy-staging.yml 1`] = ` +[ + "--contract_rs--.github--workflows--undeploy-staging.yml", + "name: Undeploy staging +on: + pull_request: + types: [closed] + +jobs: + cleanup-staging: + name: Cleanup staging account + runs-on: ubuntu-latest + env: + NEAR_CONTRACT_PR_STAGING_ACCOUNT_ID: gh-\${{ github.event.number }}.\${{ vars.NEAR_CONTRACT_STAGING_ACCOUNT_ID }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Install near CLI + run: curl --proto '=https' --tlsv1.2 -LsSf https://github.com/near/near-cli-rs/releases/download/v0.11.1/near-cli-rs-installer.sh | sh + - name: Remove staging account + run: | + near account delete-account "\${{ env.NEAR_CONTRACT_PR_STAGING_ACCOUNT_ID }}" \\ + beneficiary "\${{ vars.NEAR_CONTRACT_STAGING_ACCOUNT_ID }}" \\ + network-config "\${{ vars.NEAR_CONTRACT_STAGING_NETWORK }}" \\ + sign-with-plaintext-private-key \\ + --signer-public-key "\${{ vars.NEAR_CONTRACT_STAGING_ACCOUNT_PUBLIC_KEY }}" \\ + --signer-private-key "\${{ secrets.NEAR_CONTRACT_STAGING_ACCOUNT_PRIVATE_KEY }}" \\ + send +", +] +`; + +exports[`create contract 'rs': --contract_rs--.gitignore 1`] = ` +[ + "--contract_rs--.gitignore", + "/target +", +] +`; + exports[`create contract 'rs': --contract_rs--Cargo.toml 1`] = ` [ "--contract_rs--Cargo.toml", "[package] -name = "contract-rs" -description = "Hello Near Example" +name = "hello-rs" +description = "cargo-near-new-project-description" version = "0.1.0" edition = "2021" # TODO: Fill out the repository field to help NEAR ecosystem tools to discover your project. # NEP-0330 is automatically implemented for all contracts built with https://github.com/near/cargo-near. # Link to the repository will be available via \`contract_source_metadata\` view-function. -#repository = "https://github.com/xxx/xxx" +repository = "https://github.com//" [lib] crate-type = ["cdylib", "rlib"] +# fields to configure build with WASM reproducibility, according to specs +# in https://github.com/near/NEPs/blob/master/neps/nep-0330.md +[package.metadata.near.reproducible_build] +# docker image, descriptor of build environment +image = "sourcescan/cargo-near:0.13.1-rust-1.83.0" +# tag after colon above serves only descriptive purpose; image is identified by digest +image_digest = "sha256:cc80ff2f2a42823ffd991eaf45ea9fada71ee206d79561eea4f40ecc27bff1be" +# list of environment variables names, whose values, if set, will be used as external build parameters +# in a reproducible manner +# supported by \`sourcescan/cargo-near:0.10.1-rust-1.82.0\` image or later images +passed_env = [] +# build command inside of docker container +# if docker image from default gallery is used https://hub.docker.com/r/sourcescan/cargo-near/tags, +# the command may be any combination of flags of \`cargo-near\`, +# supported by respective version of binary inside the container besides \`--no-locked\` flag +container_build_command = ["cargo", "near", "build", "non-reproducible-wasm", "--locked"] + # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -near-sdk = "5.3.0" +near-sdk = "5.7" [dev-dependencies] -near-sdk = { version = "5.3.0", features = ["unit-testing"] } -near-workspaces = { version = "0.11.0", features = ["unstable"] } +near-sdk = { version = "5.7", features = ["unit-testing"] } +near-workspaces = { version = "0.16", features = ["unstable"] } tokio = { version = "1.12.0", features = ["full"] } serde_json = "1" @@ -42,7 +1600,7 @@ overflow-checks = true exports[`create contract 'rs': --contract_rs--README.md 1`] = ` [ "--contract_rs--README.md", - "# contract-rs + "# hello-rs cargo-near-new-project-description @@ -62,19 +1620,17 @@ cargo test ## How to Deploy? +Deployment is automated with GitHub Actions CI/CD pipeline. To deploy manually, install [\`cargo-near\`](https://github.com/near/cargo-near) and run: \`\`\`bash -# Create a new account -cargo near create-dev-account - -# Deploy the contract on it -cargo near deploy +cargo near deploy build-reproducible-wasm \`\`\` + ## Useful Links - [cargo-near](https://github.com/near/cargo-near) - NEAR smart contract development toolkit for Rust -- [near CLI](https://docs.near.org/tools/near-cli) - Interact with NEAR blockchain from command line +- [near CLI](https://near.cli.rs) - Interact with NEAR blockchain from command line - [NEAR Rust SDK Documentation](https://docs.near.org/sdk/rust/introduction) - [NEAR Documentation](https://docs.near.org) - [NEAR StackOverflow](https://stackoverflow.com/questions/tagged/nearprotocol) @@ -127,7 +1683,7 @@ impl Contract { // Public method - accepts a greeting, such as "howdy", and records it pub fn set_greeting(&mut self, greeting: String) { - log!("Saving greeting: {}", greeting); + log!("Saving greeting: {greeting}"); self.greeting = greeting; } } @@ -161,22 +1717,21 @@ mod tests { exports[`create contract 'rs': --contract_rs--tests--test_basics.rs 1`] = ` [ "--contract_rs--tests--test_basics.rs", - "use near_workspaces::types::NearToken; -use serde_json::json; - -const FIVE_NEAR: NearToken = NearToken::from_near(5); + "use serde_json::json; #[tokio::test] async fn test_contract_is_operational() -> Result<(), Box> { - let sandbox = near_workspaces::sandbox().await?; let contract_wasm = near_workspaces::compile_project("./").await?; - let root = sandbox.root_account()?; + test_basics_on(&contract_wasm).await?; + Ok(()) +} - let user_account = root.create_subaccount("user").transact().await?.unwrap(); - let contract_account = root.create_subaccount("contract").initial_balance(FIVE_NEAR).transact().await?.unwrap(); +async fn test_basics_on(contract_wasm: &[u8]) -> Result<(), Box> { + let sandbox = near_workspaces::sandbox().await?; + let contract = sandbox.dev_deploy(contract_wasm).await?; - let contract = contract_account.deploy(&contract_wasm).await?.unwrap(); + let user_account = sandbox.dev_create_account().await?; let outcome = user_account .call(contract.id(), "set_greeting") @@ -185,15 +1740,13 @@ async fn test_contract_is_operational() -> Result<(), Box .await?; assert!(outcome.is_success()); - let user_message_outcome: serde_json::Value = user_account - .view(contract.id(), "get_greeting") - .args_json(json!({})) - .await? - .json()?; - assert_eq!(user_message_outcome, "Hello World!"); + let user_message_outcome = contract.view("get_greeting").args_json(json!({})).await?; + assert_eq!(user_message_outcome.json::()?, "Hello World!"); Ok(()) } + + ", ] `; @@ -304,7 +1857,7 @@ exports[`create contract 'ts': --contract_ts--package.json 1`] = ` }, "devDependencies": { "ava": "^6.1.3", - "near-workspaces": "^3.5.0", + "near-workspaces": "^4.0.0", "typescript": "^5.4.5" }, "ava": { @@ -541,11 +2094,6 @@ exports[`create frontend 'next-app': --frontend_next-app--package.json 1`] = ` "react-dom": "^18", "wagmi": "^2.12.16" }, - "overrides": { - "@near-wallet-selector/ethereum-wallets": { - "near-api-js": "4.0.3" - } - }, "devDependencies": { "encoding": "^0.1.13", "eslint": "^8", @@ -1650,11 +3198,6 @@ exports[`create frontend 'next-page': --frontend_next-page--package.json 1`] = ` "react-dom": "^18", "wagmi": "^2.12.16" }, - "overrides": { - "@near-wallet-selector/ethereum-wallets": { - "near-api-js": "4.0.3" - } - }, "devDependencies": { "encoding": "^0.1.13", "eslint": "^8",